【问题标题】:concatenate two arrays in python with alternating the columns in numpy在 python 中连接两个数组,并在 numpy 中交替列
【发布时间】:2018-05-03 18:02:34
【问题描述】:

如何在 numpy python 中连接两个数组,方法是从第一个数组中获取第一列,从第二个数组中获取第一列,然后从第一列中获取第二列,从另一个中获取第二列,等等。那就是如果我有A=[a1 a2 a3]B=[b1 b2 b3] 我希望结果数组为[a1 b1 a2 b2 a3 b3]

【问题讨论】:

  • 这显然不是串联,而是压缩。
  • @Olaf 在处理 NumPy 数组时,连接这个术语比压缩更流行。更准确地说,它是交错的。
  • 如果这被认为是“太宽泛”了,真的很遗憾。
  • @Divakar:我故意使用了“zip-ping”这个词,因为这是一个 Python 标准函数,也应该适用于 NumPy 数组。对于 CV:OP 没有显示任何代码,也没有说明是否存在约束,例如禁止使用zip。可惜它实际上得到了三个赞成票。它没有显示任何研究工作以及为什么不使用标准方法。
  • @Olaf 又是什么“标准方式”? zip(A,B)?无论如何,任何其他压缩方式都会导致列表/元组输出。这不会给出数组输出,并且 OP 已经提到他们想要一个数组输出。将任何基于压缩的列表结果转换为数组的开销对于性能来说并不是一个好主意。这就是为什么压缩在 NumPy 领域不太流行的原因。

标签: python arrays python-3.x numpy


【解决方案1】:

如果我们有二维数组,那么我们可以执行以下操作

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]
    

    【讨论】:

      【解决方案3】:

      可以建议很少的堆叠方法 -

      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 不知道你的意思是什么 - columns are vectors。我们在 NumPy 中并没有真正的“向量”定义。我们拥有的是 1D、2D、数组等。你的意思是输入是否是 2D 数组?
      • 是的,如果 A 和 B 是二维数组,您的解决方案是否会提供具有交错列的二维数组?因为我认为ravel不管输入的形状是什么样的都会输出一维数组。
      • @Sunreef 解决方案仅适用于一维阵列。对于 2D,取决于您希望沿哪个轴进行交错。这是沿行的 - stackoverflow.com/a/47030728。应该需要对沿列进行交错进行微调。
      • 对于二维数组,试试np.stack((A,B),2).reshape(A.shape[0],-1)
      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多