Python 逐行组合两个numpy矩阵的最佳方式是什么?

Python 逐行组合两个numpy矩阵的最佳方式是什么?,python,arrays,numpy,Python,Arrays,Numpy,我有两个numpy 2D矩阵I和u import numpy as np u = np.array([[1,2,3],[3,4,5]]) i = np.random.rand(3,4) u array([[1, 2, 3], [3, 4, 5]]) i array([[0.01564089, 0.01274327, 0.39282509, 0.25177788], [0.08531619, 0.04668083, 0.91260452, 0.63481191],

我有两个numpy 2D矩阵I和u

import numpy as np
u = np.array([[1,2,3],[3,4,5]])
i = np.random.rand(3,4)
u
array([[1, 2, 3],
       [3, 4, 5]])
i
array([[0.01564089, 0.01274327, 0.39282509, 0.25177788],
       [0.08531619, 0.04668083, 0.91260452, 0.63481191],
       [0.34607795, 0.87053449, 0.27467456, 0.02215169]])
我想一行一行地组合两个矩阵,如下所示

array([[1,2,3, 0.01564089, 0.01274327, 0.39282509, 0.25177788],
[1,2,3, 0.08531619, 0.04668083, 0.91260452, 0.63481191],
[1,2,3, 0.34607795, 0.87053449, 0.27467456, 0.02215169],
[3,4,5, 0.01564089, 0.01274327, 0.39282509, 0.25177788],
[3,4,5, 0.08531619, 0.04668083, 0.91260452, 0.63481191],
[3,4,5, 0.34607795, 0.87053449, 0.27467456, 0.02215169]]
)

您可以使用
itertools.product

import itertools  
ls=[np.concatenate([x,y]).tolist() for x,y in itertools.product(u, i)]
combinedarray=np.array(ls)
combinedarray
输出:

u
[[1 2 3]
 [3 4 5]]

i
[[0.99154112 0.72960938 0.5764647  0.34136825]
 [0.6014229  0.81085954 0.00631983 0.15401643]
 [0.98828194 0.46407222 0.60403416 0.20934805]]

combinedarray
array([[1.     , 2.     , 3.     , 0.99154112, 0.72960938, 0.5764647, 0.34136825],
       [1.     , 2.     , 3.     , 0.6014229 , 0.81085954, 0.00631983, 0.15401643],
       [1.     , 2.     , 3.     , 0.98828194, 0.46407222, 0.60403416, 0.20934805],
       [3.     , 4.     , 5.     , 0.99154112, 0.72960938, 0.5764647, 0.34136825],
       [3.     , 4.     , 5.     , 0.6014229 , 0.81085954, 0.00631983, 0.15401643],
       [3.     , 4.     , 5.     , 0.98828194, 0.46407222, 0.60403416, 0.20934805]])
array([[1.   , 2.   , 3.   , 0.832, 0.885, 0.86 , 0.233],
       [1.   , 2.   , 3.   , 0.76 , 0.46 , 0.421, 0.654],
       [1.   , 2.   , 3.   , 0.083, 0.   , 0.981, 0.047],
       [3.   , 4.   , 5.   , 0.832, 0.885, 0.86 , 0.233],
       [3.   , 4.   , 5.   , 0.76 , 0.46 , 0.421, 0.654],
       [3.   , 4.   , 5.   , 0.083, 0.   , 0.981, 0.047]])

单向使用
numpy.repeat
numpy.tile

def join(arr1, arr2):
    a1 = np.repeat(arr1, arr2.shape[0], 0)
    a2 = np.tile(arr2, (arr1.shape[0], 1))
    return np.hstack([a1, a2])
join(u, i)
输出:

u
[[1 2 3]
 [3 4 5]]

i
[[0.99154112 0.72960938 0.5764647  0.34136825]
 [0.6014229  0.81085954 0.00631983 0.15401643]
 [0.98828194 0.46407222 0.60403416 0.20934805]]

combinedarray
array([[1.     , 2.     , 3.     , 0.99154112, 0.72960938, 0.5764647, 0.34136825],
       [1.     , 2.     , 3.     , 0.6014229 , 0.81085954, 0.00631983, 0.15401643],
       [1.     , 2.     , 3.     , 0.98828194, 0.46407222, 0.60403416, 0.20934805],
       [3.     , 4.     , 5.     , 0.99154112, 0.72960938, 0.5764647, 0.34136825],
       [3.     , 4.     , 5.     , 0.6014229 , 0.81085954, 0.00631983, 0.15401643],
       [3.     , 4.     , 5.     , 0.98828194, 0.46407222, 0.60403416, 0.20934805]])
array([[1.   , 2.   , 3.   , 0.832, 0.885, 0.86 , 0.233],
       [1.   , 2.   , 3.   , 0.76 , 0.46 , 0.421, 0.654],
       [1.   , 2.   , 3.   , 0.083, 0.   , 0.981, 0.047],
       [3.   , 4.   , 5.   , 0.832, 0.885, 0.86 , 0.233],
       [3.   , 4.   , 5.   , 0.76 , 0.46 , 0.421, 0.654],
       [3.   , 4.   , 5.   , 0.083, 0.   , 0.981, 0.047]])
您的阵列(将
i
更改为int以使显示更加紧凑):

制作目标阵列-三维:

In [233]: res1 = np.zeros((2,3,7))                                                                   
将(2,3)
u
更改为(2,1,3),并让广播将其扩展为(2,3,3):

然后将(3,4)
i
广播到(2,3,4)插槽

然后将形状改为(6,7):

所有值必须是int或float。(Object-dtype允许混合,但这种数组的数学运算速度较慢)

我说不出哪种方法最快。一个可能最适合这样的小例子(我打赌是在itertools上),另一个(我的?)最适合大型案例

In [235]: res1[:,:,3:]=i[None,:,:]       # None is optional here                                                            
In [236]: res1                                                                                       
Out[236]: 
array([[[ 1.,  2.,  3., 40., 20., 40., 10.],
        [ 1.,  2.,  3., 20., 10., 90., 50.],
        [ 1.,  2.,  3., 50., 10., 10., 30.]],

       [[ 3.,  4.,  5., 40., 20., 40., 10.],
        [ 3.,  4.,  5., 20., 10., 90., 50.],
        [ 3.,  4.,  5., 50., 10., 10., 30.]]])
In [237]: res1.reshape(-1,7)                                                                         
Out[237]: 
array([[ 1.,  2.,  3., 40., 20., 40., 10.],
       [ 1.,  2.,  3., 20., 10., 90., 50.],
       [ 1.,  2.,  3., 50., 10., 10., 30.],
       [ 3.,  4.,  5., 40., 20., 40., 10.],
       [ 3.,  4.,  5., 20., 10., 90., 50.],
       [ 3.,  4.,  5., 50., 10., 10., 30.]])