方法#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]