Python 如何高效地合并二维上的两个3d阵列?
假设我有两个形状为(1.000.000,?,50)的三维阵列(a和b)(?=见下文) 如何合并它们, 结果是(1.000.000,{a+b的第二维度的形状},50) 下面是示例,如下所示:(也可以使用np.array) 编辑:添加了可用代码,请滚动^^Python 如何高效地合并二维上的两个3d阵列?,python,pandas,performance,numpy,merge,Python,Pandas,Performance,Numpy,Merge,假设我有两个形状为(1.000.000,?,50)的三维阵列(a和b)(?=见下文) 如何合并它们, 结果是(1.000.000,{a+b的第二维度的形状},50) 下面是示例,如下所示:(也可以使用np.array) 编辑:添加了可用代码,请滚动^^ [ #a [ ], [ [1 2 3] ], [ [0 2 7] [
[ #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]
]
]
你知道一种有效的方法吗
编辑:尝试连接(无效):
要执行连接,请运行:
result = np.concatenate([a, b], axis=1)
为了测试这段代码,我将a和b创建为:
因此,它们包含:
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)和(2,3,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开始编辑以下注释
我尝试了你评论中的代码。
执行a=list((map(lambda i:a[:i],range(1,a.shape[0]+1)))后)
,
结果是:
[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是一个大小不同的数组的列表
您构建数据的方式有问题。
首先检查两个阵列是否都是三维的,并且它们的形状是否不同
仅在轴1中。只有这样你才能在他们身上运行我的代码。
目前,a和b都是简单的pythonic列表,而不是Numpy数组 维度中不能有长度可变的数组
a
和b
最有可能是列表列表,而不是数组。您可以将列表理解与zip一起使用:
np.array([x+y for x,y in zip(a,b)])
编辑:如果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. 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.]]]
你能将数组格式化为有效的代码吗?@anon01编辑了它^^^谢谢你的提示。你的回答提供了一些见解,但你的
a
和b
结构与OP在问题中提供的示例不同。尝试过它,但它无法处理不断增加的行数。。。这是一个可复制的示例:@Ehsan尝试了它,但它无法处理不断增加的行数。。。这里是一个可复制的示例:DF_LEN,colu 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=columns))B=list(map(da:i:B[:i],range(1,B.shape[0]):-B]a=1)[0];dela[0]b_last=b[-1];delb[-1]结果=np。连接([a,b],轴=1)>>>AxisError:轴1超出维度数组的范围1@La-Li Lu Le Lo我建议您不要使用构建数组列表的方式。另一篇文章中的编辑应该可以解决此问题。此外,请查看如何接受有关此问题的答案。到目前为止,您的任何问题都没有接受答案。感谢您的e不知怎的,我无法将这些子发布者转换为数组:a=np.array([np.asarray([np.asarray(x)表示切片中的x])表示切片中的x])b=np.array([np.asarray([np.asarray(x)表示切片中的x])表示切片中的x。)代码尝试了以下方法:(可复制)DF LEN COL LEN cols=20,5,['a',b']a=np asarray(pd.frame(1,index=datarange(DF LEN 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:b[:i],range(1,b.shape[0]+1)))b=a[0];del a[0]b_=last=b[-1];del-b[-1]打印(LEN(LEN(LEN)(LEN(a),用于压缩,LEN=)x,print(x)x(“y=,y)result=np.array([x+y代表x,y在zip(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. 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.]]]