如何有效地合并二维的两个三维阵列



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

如何将它们合并,因此结果将是(1.000.000,{a的形状+b的第二维度},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

维度中不能有长度可变的数组。CCD_ 1和CCD_。您可以将列表理解与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. 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.]]]

要执行串联,请运行:

result = np.concatenate([a, b], axis=1)

为了测试此代码,我将ab创建为:

a = np.stack([ np.full((2, 3), i) for i in range(1, 6)], axis=1)
b = np.stack([ np.full((2, 3), i + 10) for i in range(1, 4)], axis=1)

所以它们包含:

array([[[1, 1, 1],        array([[[11, 11, 11],
[2, 2, 2],                [12, 12, 12],
[3, 3, 3],                [13, 13, 13]],
[4, 4, 4],        
[5, 5, 5]],              [[11, 11, 11],
[12, 12, 12],
[[1, 1, 1],                [13, 13, 13]]])
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5]]])

其形状为:(2,5,3(

我的串联结果是:

array([[[ 1,  1,  1],
[ 2,  2,  2],
[ 3,  3,  3],
[ 4,  4,  4],
[ 5,  5,  5],
[11, 11, 11],
[12, 12, 12],
[13, 13, 13]],
[[ 1,  1,  1],
[ 2,  2,  2],
[ 3,  3,  3],
[ 4,  4,  4],
[ 5,  5,  5],
[11, 11, 11],
[12, 12, 12],
[13, 13, 13]]])

并且形状是(2,8,3(,正如它应该的那样。

在19:56Z的评论后编辑

我试过了你评论中的代码。在执行CCD_ 5之后,结果是:

[array([[1, 1]], dtype=int64),
array([[1, 1],
[1, 1]], dtype=int64),
array([[1, 1],
[1, 1],
[1, 1]], dtype=int64),
array([[1, 1],
[1, 1],
[1, 1],
[1, 1]], dtype=int64),
array([[1, 1],
[1, 1],
[1, 1],
[1, 1],
[1, 1]], dtype=int64),
...

因此a是大小不等的数组的列表

你构建数据的方式有问题。首先检查您的两个数组是否为3-D,并且它们的形状是否不同仅在轴1中。只有这样你才能在它们上运行我的代码。目前,ab都是普通的蟒蛇列表,而不是Numpy数组!

最新更新