将两个数组混合在一起,使得对应的列相互堆叠在一起 - Python

4

假设我有两个二维矩阵A和B,我想将A中的每一列与B中相应的列连接起来。例如:

A = array([[1, 1],
           [1, 1]])
B = array([[2, 3],
           [2, 3]])

所以我期望的结果是:

array([[1, 2, 1, 3],
       [1, 2, 1, 3]])

底部行被删除了(因为a有三行)? - Willem Van Onsem
问题缺乏适当的规范。 - timgeb
@victor:您希望这仅适用于2D矩阵,还是维数可以是任意的?在这种情况下,如何处理这些维度(如果您感到烦恼,我只是想让问题足够明确)。 - Willem Van Onsem
输出结果看起来像是您正在尝试交错矩阵A和B的行,而不是列。这正确吗? - James
@WillemVanOnsem 感谢您的耐心等待。我没有澄清问题。是的,我只想为一个2D矩阵工作。再次感谢! - victor
显示剩余4条评论
4个回答

3
你可以尝试将这两个数组连接起来,然后使用“reshape”和“transpose”重新排列数据:
x = np.concatenate((A, B)).reshape(2,2,2)
x
# array([[[1, 1],
#         [1, 1]],

#        [[2, 3],
#         [2, 3]]])

x.transpose(1,2,0).reshape(2,4)

# array([[1, 2, 1, 3],
#        [1, 2, 1, 3]])

谢谢!这很有帮助 - victor
请查看我的答案,这里有一些更直接的内容。 - Crispin

2

最简单的方式是通过列优先(Fortran)排序实现:

import numpy as np

def mix_arrays(a,b):
    return np.concatenate((a,b)).reshape(2,4, order='F')

通过您提供的输入,AB

>>> mix_arrays(A,B)
array([[1, 2, 1, 3],
       [1, 2, 1, 3]])

1
你可以简单地构建一个具有正确维度的新数组,并使用切片来正确填充数字。例如:
def mix_matrices(a,b):
    (ma,na) = a.shape
    (mb,nb) = b.shape
    if mb < ma:
        ma = mb
    c = np.zeros((ma,na+nb))
    c[:ma,::2] = a[:ma]
    c[:ma,1::2] = b[:ma]
    return c

This generates:

>>> mix_matrices(A,B)
array([[ 1.,  2.,  1.,  3.],
       [ 1.,  2.,  1.,  3.]])

1

这里是涉及np.dstackreshape的示例 -

np.dstack((A,B)).reshape(-1,A.shape[1]*2)

示例运行 -

In [44]: A
Out[44]: 
array([[2, 7, 3, 0, 8],
       [1, 0, 6, 7, 6],
       [3, 4, 7, 7, 6],
       [0, 3, 7, 5, 4]])

In [45]: B
Out[45]: 
array([[8, 4, 3, 8, 0],
       [3, 1, 8, 8, 2],
       [8, 5, 8, 8, 4],
       [1, 0, 6, 1, 7]])

In [46]: np.dstack((A,B)).reshape(-1,A.shape[1]*2)
Out[46]: 
array([[2, 8, 7, 4, 3, 3, 0, 8, 8, 0],
       [1, 3, 0, 1, 6, 8, 7, 8, 6, 2],
       [3, 8, 4, 5, 7, 8, 7, 8, 6, 4],
       [0, 1, 3, 0, 7, 6, 5, 1, 4, 7]])

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