Python 逐行组合两个numpy矩阵的最佳方式是什么?
我有两个numpy 2D矩阵I和uPython 逐行组合两个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],
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.]])