首页 > 解决方案 > 如何有效地合并二维上的两个 3d 数组?

问题描述

假设我有两个形状为 (1.000.000, ???, 50), (??? = 见下文) 的 3 维数组 (a & b)。

如何合并它们,使结果为 (1.000.000, {shape of a's + b's second dimension} , 50)?

以下是示例,如下所示:(np.arrays 也是可能的)

编辑:添加了可用的代码,请滚动^^

[ #a
     [           
                 ],
     [ 
       [1  2  3]
                 ],
     [ 
       [0  2    7]
       [1  Nan  3]
                 ],
     [ 
       [10   0  3]
       [NaN  9  9]
       [10 NaN  3]
                 ],
     [ 
       [8  2  0]
       [2  2  3]
       [8  1  3]
       [1  2  3]
                 ],
     [ 
       [0  2  3]
       [1  2  9]
       [1  2  3]
       [1  0  3]
       [1  2  3]
                 ]
                     ] 



[#b
     [ 
       [7  2  3]
       [1  2  9]
       [1  2  3]
       [8  0  3]
       [1  7  3]
                 ]
     [ 
       [3  9  0]
       [2  2  3]
       [8  1  3]
       [0  2  3]
                 ],
     [ 
       [10   0  3]
       [0  NaN  9]
       [10 NaN  3]
                 ],
     [ 
       [0  2  NaN]
       [1  Nan  3]
                 ],
     [ 
       [1  2  NaN]
                 ],
     [           
                 ]
                     ] 

a = [    [                ],
     [ [1, 2, 3]          ],
     [ [0, 2, 7],  [1,np.nan,3]   ],
     [ 
       [10,0,3],  [np.nan,9,9],  [10,np.nan,3]
                 ],
     [ 
       [8,2,0],  [2,2,3],  [8,1,3],  [1,2,3]
                 ],
     [   
      [0,2,3],  [1,2,9],  [1,2,3],  [1,0,3],     [1,2,3]    
                 ]
                     ] 
 
b = [
     [ 
       [7,2,3],     [1,2,9],   [1,2,3],  [8,0,3],   [1,7,3]
                   ],
     [ 
       [3,9,0],   [2,2,3],   [8,1,3],   [0,2,3]
                   ],
     [ 
       [10,0,3],  [0,np.nan,9],   [10,np.nan,3]
                   ],
     [ 
       [0,2,np.nan],  [1,np.nan,3]
                   ],
     [ 
       [1,2,np.nan]
                   ],
     [           
                   ]
                     ]

预期结果:

[ 
     [ [7  2  3]# from b
       [1  2  9]# from b
       [1  2  3]# from b
       [8  0  3]# from b
       [1  7  3]# from b
                  ],
     [ 
       [1  2  3]
       [3  9  0]# from b
       [2  2  3]# from b
       [8  1  3]# from b
       [0  2  3]# from b
                 ],
     [ 
       [0  2    7]
       [1  Nan  3]
       [10   0  3]# from b
       [0  NaN  9]# from b
       [10 NaN  3]# from b
                 ],
     [ 
       [10   0  3]
       [NaN  9  9]
       [10 NaN  3]
       [0  2  NaN]# from b
       [1  Nan  3]# from b
                    ],
     [ 
       [8  2  0]
       [2  2  3]
       [8  1  3]
       [1  2  3]
       [1  2  NaN]# from b
                 ],
     [ 
       [0  2  3]
       [1  2  9]
       [1  2  3]
       [1  0  3]
       [1  2  3]
                 ] 
                     ] 

你知道一种有效地做到这一点的方法吗?

编辑:尝试连接(没有工作):

DF_LEN, COL_LEN, cols = 20,5,['A', 'B']
a = np.asarray(pd.DataFrame(1, index=range(DF_LEN), columns=cols))
a = list((map(lambda i: a[:i], range(1,a.shape[0]+1))))
  
b = np.asarray(pd.DataFrame(np.nan, index=range(DF_LEN), columns=cols))
b = list((map(lambda i: b[:i], range(1,b.shape[0]+1))))
b = b[::-1]

a_first = a[0];  del a[0]
b_last  = b[-1]; del b[-1]
result  = np.concatenate([a, b], axis=1)

>>>AxisError: axis 1 is out of bounds for array of dimension 1

标签: pythonpandasperformancenumpymerge

解决方案


您不能在维度中拥有可变长度的数组。a并且b很可能是列表列表而不是数组。您可以将列表理解与 zip 一起使用:

np.array([x+y for x,y in zip(a,b)]) 

编辑:或基于提供的评论,如果ab是数组列表:

np.array([np.vstack((x,y)) for x,y in zip(a,b)])

您的示例的输出如下所示:

[[[ 7.  2.  3.]
  [ 1.  2.  9.]
  [ 1.  2.  3.]
  [ 8.  0.  3.]
  [ 1.  7.  3.]]

 [[ 1.  2.  3.]
  [ 3.  9.  0.]
  [ 2.  2.  3.]
  [ 8.  1.  3.]
  [ 0.  2.  3.]]

 [[ 0.  2.  7.]
  [ 1. nan  3.]
  [10.  0.  3.]
  [ 0. nan  9.]
  [10. nan  3.]]

 [[10.  0.  3.]
  [nan  9.  9.]
  [10. nan  3.]
  [ 0.  2. nan]
  [ 1. nan  3.]]

 [[ 8.  2.  0.]
  [ 2.  2.  3.]
  [ 8.  1.  3.]
  [ 1.  2.  3.]
  [ 1.  2. nan]]

 [[ 0.  2.  3.]
  [ 1.  2.  9.]
  [ 1.  2.  3.]
  [ 1.  0.  3.]
  [ 1.  2.  3.]]]

推荐阅读