为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕后森 2023-06-27 17:23:23
假设我有两个形状为 (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]                   ],     [                              ]                     ]您知道一种有效的方法吗?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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


查看完整回答
反对 回复 2023-06-27
?
MYYA

TA贡献1868条经验 获得超4个赞

要执行串联,请运行:


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数组!


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信