在Python中使用NumPy交替列拼接两个数组

8
如何在numpy python中连接两个数组,通过从第一个数组中获取第一列和从第二个数组中获取第一列,然后从第一个数组中获取第二列和从另一个数组中获取第二列等等。也就是说,如果我有A=[a1 a2 a3]B=[b1 b2 b3],我希望得到的结果数组为[a1 b1 a2 b2 a3 b3]

2
这显然不是连接,而是压缩。 - too honest for this site
1
@Olaf 嗯,当处理NumPy数组时,“连接(concatenate)”这个术语比“压缩(zipping)”更受欢迎。为了更准确地描述术语,应该使用“交错(interleaving)”。 - Divakar
1
如果这被认为是“过于宽泛”,那真是太遗憾了,根据投票结果。 - Divakar
1
@Olaf,“标准方式”是什么来着?zip(A,B)?任何其他的压缩方式都会导致列表/元组输出。这样做不会得到数组输出,OP已经提到他们想要一个数组输出。将任何基于压缩的列表结果转换为数组的开销对性能不利,这就是为什么在NumPy领域中压缩并不太流行的原因。 - Divakar
@Divakar:“将任何基于压缩的列表结果转换为数组的开销对性能不利。” - 我在问题中没有看到任何关于性能的提及。看起来这是简历过于宽泛的原因之一。 - too honest for this site
显示剩余2条评论
3个回答

6
几种层叠的方法可以建议 -
np.vstack((A,B)).ravel('F')
np.stack((A,B)).ravel('F')
np.ravel([A,B],'F')

样例运行 -

In [291]: A
Out[291]: array([3, 5, 6])

In [292]: B
Out[292]: array([13, 15, 16])

In [293]: np.vstack((A,B)).ravel('F')
Out[293]: array([ 3, 13,  5, 15,  6, 16])

In [294]: np.ravel([A,B],'F')
Out[294]: array([ 3, 13,  5, 15,  6, 16])

如果这些列是向量而不是标量,这个代码还能正常工作吗? - Sunreef
@Sunreef 不确定您所说的“列是向量”的意思。在NumPy中,我们实际上没有“向量”这个定义。我们拥有的是1D、2D、数组等。您是指输入是否为2D数组吗? - Divakar
如果A和B是2D数组,您的解决方案是否会提供一个交错列的2D数组?因为我认为ravel无论输入形状如何都会输出一个1D数组。 - Sunreef
@Sunreef 这里仅适用于一维数组。对于二维数组,它取决于您希望沿哪个轴进行交错。这是沿行的方法-https://stackoverflow.com/a/47030728/。需要在沿列交错方面进行微小调整。 - Divakar
对于二维数组,请尝试使用 np.stack((A,B),2).reshape(A.shape[0],-1) - hpaulj
@hpaulj 对于按列交错的情况,是的。 - Divakar

3
如果我们有二维数组,那么我们可以执行以下操作。
A = np.zeros((5,2))
B = np.ones((5,2))
row_a, col_a = np.shape(A)
row_b, col_b = np.shape(B)

交替混淆列
assert row_a == row_b, 'number of rows should be same'
np.ravel([A,B],order="F").reshape(row_a,col_a+col_b)

这将提供

array([[0., 1., 0., 1.],
       [0., 1., 0., 1.],
       [0., 1., 0., 1.],
       [0., 1., 0., 1.],
       [0., 1., 0., 1.]])

混合行
assert col_a == col_b, 'number of cols should be same'
np.ravel([A,B],order="F").reshape(col_a,row_a+row_b).T

这将会给予

array([[0., 0.],
       [1., 1.],
       [0., 0.],
       [1., 1.],
       [0., 0.],
       [1., 1.],
       [0., 0.],
       [1., 1.],
       [0., 0.],
       [1., 1.]])

2
使用numpy.dstack()和numpy.flatten()函数:
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.dstack((a,b)).flatten()

print(result)

输出:

[1 4 2 5 3 6]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接