如何有效地合并二维上的两个 3d 数组? [英] how to merge two 3d-arrays on the 2nd dimension efficiently?

查看:40
本文介绍了如何有效地合并二维上的两个 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楠3]],[[10 0 3][南 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 南 9][10 NaN 3]],[[0 2 NaN][1楠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]]]乙 = [[[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]# 来自 b[1 2 9]# 来自 b[1 2 3]# 来自 b[8 0 3]# 来自 b[1 7 3]# 来自 b],[[1 2 3][3 9 0]# 来自 b[2 2 3]# 来自 b[8 1 3]# 来自 b[0 2 3]# 来自 b],[[0 2 7][1楠3][10 0 3]# 来自 b[0 NaN 9]# 来自 b[10 NaN 3]# 来自 b],[[10 0 3][南 9 9][10 NaN 3][0 2 NaN]# 来自 b[1 南 3]# 来自 b],[[8 2 0][2 2 3][8 1 3][1 2 3][1 2 NaN]# 来自 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];删除[0]b_last = b[-1];del b[-1]结果 = np.concatenate([a, b], axis=1)>>>AxisError: 轴 1 超出维度 1 数组的范围

解决方案

在一个维度中不能有可变长度的数组.ab 最有可能是列表而不是数组.您可以将列表理解与 zip 一起使用:

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

EDIT:或者基于提供的注释,如果 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. 南 3.][10.0. 3.][ 0. 南 9.][10.南 3.]][[10.0. 3.][nan 9. 9.][10.南 3.][ 0. 2. nan][ 1. 南 3.]][[ 8. 2. 0.][ 2. 2. 3.][ 8. 1. 3.][ 1. 2. 3.][ 1. 2. 南]][[ 0. 2. 3.][ 1. 2. 9.][ 1. 2. 3.][ 1. 0. 3.][ 1. 2. 3.]]]

Lets say I have two 3 dimensional arrays (a & b) of shape (1.000.000, ???, 50), (??? = see below).

How to merge them, so that the result will be (1.000.000, {shape of a's + b's second dimension} , 50)?

Here are the samples, as you can see below: (np.arrays are also possible)

EDIT: added usable code, please scroll^^

[ #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]
                   ],
     [           
                   ]
                     ]

expected outcome:

[ 
     [ [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]
                 ] 
                     ] 

Do you know a way to do that efficiently?

EDIT: tried concatenate (didnt work):

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

解决方案

You cannot have an array with variable length in a dimension. a and b are most likely list of lists and not arrays. You can use list comprehension along with zip:

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

EDIT: or based on comment provided if a and b are lists of arrays:

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

The output for your example looks like:

[[[ 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.]]]

这篇关于如何有效地合并二维上的两个 3d 数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆