python求数组的所有组合_python – 两个numpy数组中所有行的组合

方法#1

关注性能这里的一种方法是使用数组初始化和元素广播进行分配 –

m1,n1 = a1.shape

m2,n2 = a2.shape

out = np.zeros((m1,m2,n1+n2),dtype=int)

out[:,:,:n1] = a1[:,None,:]

out[:,n1:] = a2

out.shape = (m1*m2,-1)

说明:

诀窍在于两个步骤:

out[:,n1:] = a2

步骤1 :

In [227]: np.random.seed(0)

In [228]: a1 = np.random.randint(1,9,(3,2))

In [229]: a2 = np.random.randint(1,(2,7))

In [230]: m1,n1 = a1.shape

...: m2,n2 = a2.shape

...: out = np.zeros((m1,dtype=int)

...:

In [231]: out[:,:]

In [232]: out[:,:n1]

Out[232]:

array([[[5,8],[5,8]],[[6,1],[6,1]],[[4,4],[4,4]]])

In [233]: a1[:,:]

Out[233]:

array([[[5,4]]])

因此,基本上我们分配a1的元素,保持第一轴与输出中相应的一个轴对齐,同时让输出数组的第二轴上的元素以广播的方式填充,对应于为a1添加的newaxis那个轴.这是关键所在并带来性能,因为我们没有分配额外的内存空间,否则我们需要使用显式的重复/平铺方法.

第2步 :

In [237]: out[:,n1:] = a2

In [238]: out[:,n1:]

Out[238]:

array([[[4,8,2,4,6,3,5],[8,7,1,5,2]],2]]])

In [239]: a2

Out[239]:

array([[4,2]])

这里,我们基本上沿着输出数组的第一轴广播块a2而不明确地重复复制.

样本输入,输出完整性 –

In [242]: a1

Out[242]:

array([[5,4]])

In [243]: a2

Out[243]:

array([[4,2]])

In [244]: out

Out[244]:

array([[[5,2]]])

方法#2

另一个有平铺/重复 –

parte1 = np.repeat(a1[:,:],axis=0).reshape(-1,m2)

parte2 = np.repeat(a2[None],m1,n2)

out = np.c_[parte1,parte2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值