如何有效地在二维上合并两个 3d 数组?

假设我有两个形状为 (1.000.000, ???, 50) 的 3 维数组 (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]

                   ],

     [           

                   ]

                     ]

您知道一种有效的方法吗?

慕后森
浏览 143回答 2
2回答

哈士奇WWW

您不能拥有一个维度长度可变的数组。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.]]]

MYYA

要执行串联,请运行:result = np.concatenate([a, b], axis=1)为了测试这段代码,我创建了a和b: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)和(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),正如它应该的那样。我尝试了您评论中的代码。执行后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是不同大小的数组的列表。您构建数据的方式有问题。首先检查您的两个数组是否都是3-D的,并且它们的形状仅在轴 1 上有所不同。只有这样您才能在它们上运行我的代码。现在a和b都是普通的pythonic 列表,而不是Numpy数组!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python