【问题标题】:How to stack uneven numpy arrays?如何堆叠不均匀的numpy数组?
【发布时间】:2021-06-07 21:16:04
【问题描述】:

如何将数组列表中每个数组的相同索引中的元素堆叠起来?

arrays = [np.array([1,2,3,4,5]),
          np.array([6,7,8,9]),
          np.array([11,22,33,44,55]),
          np.array([2,4])]

output = [[1,6,11,2],
          [2,7,22,4],
          [3,8,33],
          [4,9,44],
          [5,55]]

arrays 是长度不均匀的数组的列表。 output 有一个第一个数组(不介意它是否也是一个列表),其中包含每个数组中所有可能的索引 0。 output 中的下一个数组包含所有可能的索引 1,依此类推...

我能找到的最接近的东西(但需要相同的形状数组)是:

a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.stack((a, b), axis=-1)
# which gives
array([[1, 2],
       [2, 3],
       [3, 4]])

谢谢。

【问题讨论】:

  • 通常组合不规则形状的数组表明 numpy 不是正确的工具。这是干什么用的?

标签: python arrays list numpy


【解决方案1】:

您可以先将其包装在 DataFrame 中:

arr = pd.DataFrame(arrays).values.T

输出:

array([[ 1.,  6., 11.,  2.],
       [ 2.,  7., 22.,  4.],
       [ 3.,  8., 33., nan],
       [ 4.,  9., 44., nan],
       [ 5., nan, 55., nan]])

如果你真的想要不同尺寸的,那就去吧:

arr = [x.dropna().values for _, x in pd.DataFrame(arrays).iteritems()]                                             

输出:

[array([ 1,  6, 11,  2]),
 array([ 2,  7, 22,  4]),
 array([ 3.,  8., 33.]),
 array([ 4.,  9., 44.]),
 array([ 5., 55.])]

【讨论】:

    【解决方案2】:

    这让你接近。您不能真正拥有如示例输出中所示的 2D 稀疏数组。

    import numpy as np
    
    arrays = [np.array([1,2,3,4,5]),
              np.array([6,7,8,9]),
              np.array([11,22,33,44,55]),
              np.array([2,4])]
    
    maxx = max(x.shape[0] for x in arrays)
    for x in arrays:
        x.resize(maxx,refcheck=False)
    output = np.stack(arrays, axis=1)
    print(output)
    
    C:\tmp>python x.py
    [[ 1  6 11  2]
     [ 2  7 22  4]
     [ 3  8 33  0]
     [ 4  9 44  0]
     [ 5  0 55  0]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 2022-01-19
      • 2021-09-24
      相关资源
      最近更新 更多