合并多维numpy数组

6
我是一个有用的助手,可以进行文本翻译。

我在将数组以某种方式组合时遇到了一些小问题。 假设我们有

a=array([[1,1,1],[2,2,2],[3,3,3]])

b=array([[10,10,10],[20,20,20],[30,30,30]])

我希望得到

c=array([[[1,1,1],[10,10,10]],[[2,2,2],[20,20,20]],[[3,3,3],[30,30,30]]])

实际问题是我的数组a和b比3个坐标要长得多!
使用concatenate最好的结果是:
concatenate((a,b),axis=2)
它的结果是
array([[ 1, 1, 1, 10, 10, 10], [ 2, 2, 2, 20, 20, 20], [ 3, 3, 3, 30, 30, 30]])
这很不错,但是深度还不够。
此外,我尝试了另一个问题中的方法来获得所需的深度:

d=concatenate((a[...,None],b[...,None]),axis=2)

但结果是:
 array([[[ 1, 10],
    [ 1, 10],
    [ 1, 10]],

   [[ 2, 20],
    [ 2, 20],
    [ 2, 20]],

   [[ 3, 30],
    [ 3, 30],
    [ 3, 30]]])

依然无法工作...

3个回答

6

你是否想要的是 zip(a,b)

这不是你想要的吗?

>>> a=array([[1,1,1],[2,2,2],[3,3,3]]);b=array([[10,10,10],[20,20,20],[30,30,30]
>>> zip(a,b)
[(array([1, 1, 1]), array([10, 10, 10])), (array([2, 2, 2]), array([20, 20, 20])), (array([3, 3, 3]), array([30, 30, 30]))]

谢谢!我正在寻找array(zip(a,b))。 - user2988577
1
如果你想要输出为一个数组,即如果你执行np.array(zip(a, b)),对于更大的数组来说,这比@BiRico的方法慢了10倍以上。 - Jaime
是的,那可能是一个合理的说法...如果您不需要将其转换回np.array呢?(我懒得检查) - Joran Beasley

5

看起来你想在0和1之间添加一个新的轴,因此将None放在中间。这将使轴1变为轴2,并在1处创建一个新维度。就像这样:

a = array([[1,1,1],[2,2,2],[3,3,3]])
b = array([[10,10,10],[20,20,20],[30,30,30]])
c = concatenate((a[:, None, :], b[:, None, :]), axis=1)

>>> c
array([[[ 1,  1,  1],
    [10, 10, 10]],

   [[ 2,  2,  2],
    [20, 20, 20]],

   [[ 3,  3,  3],
    [30, 30, 30]]])

2

您需要使用numpy.stack。它用于沿新轴连接数组;与“numpy.concatenate”相比,后者是用于沿现有轴连接数组。使用stack时,您指定要连接的轴,该轴将在堆叠之后成为一个新的轴, 所以您需要指定轴 1。

a = array([[1,1,1],[2,2,2],[3,3,3]])
b = array([[10,10,10],[20,20,20],[30,30,30]])
c = stack((a, b), axis=1)

>>> c
array([[[ 1,  1,  1],
    [10, 10, 10]],

   [[ 2,  2,  2],
    [20, 20, 20]],

   [[ 3,  3,  3],
    [30, 30, 30]]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接