如何有效地合并二维上的两个 3d 数组? [英] how to merge two 3d-arrays on the 2nd dimension efficiently?
问题描述
假设我有两个形状为 (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 数组的范围
在一个维度中不能有可变长度的数组.a
和 b
最有可能是列表而不是数组.您可以将列表理解与 zip 一起使用:
np.array([x+y for x,y in zip(a,b)])
EDIT:或者基于提供的注释,如果 a
和 b
是数组列表:
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屋!