Python 如何高效地合并二维上的两个3d阵列?

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

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

如何合并它们, 结果是(1.000.000,{a+b的第二维度的形状},50)

下面是示例,如下所示:(也可以使用np.array)

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

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