连接第四维中的两个numpy数组

Mar*_*iet 27 python numpy

我有两个三维(3 x 4 x 5)的numpy数组,我想连接它们,所以结果有四个维度(3 x 4 x 5 x 2).在Matlab中,这可以使用cat(4, a, b),但不能在Numpy中完成.

例如:

a = ones((3,4,5))
b = ones((3,4,5))
c = concatenate((a,b), axis=3) # error!
Run Code Online (Sandbox Code Playgroud)

为了澄清,我希望c[:,:,:,0]c[:,:,:,1]对应原始的两个数组.

Jos*_*del 28

干得好:

import numpy as np
a = np.ones((3,4,5))
b = np.ones((3,4,5))
c = np.concatenate((a[...,np.newaxis],b[...,np.newaxis]),axis=3)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要以这种方式堆叠一系列数组,你可以使用:`c = np.concatenate([aux [...,np.newaxis] for aux in sequence_of_arrays],axis = 3) (7认同)
  • 更一般地说,无论原始数组中的维数是多少,都可以使用`axis = -1`. (6认同)
  • 接受这一点是为了更具可读性.另外,它使我无法理解`...`运算符. (3认同)

Dan*_*iel 16

关于什么

c = np.stack((a,b), axis=3)
Run Code Online (Sandbox Code Playgroud)

  • 此功能在numpy版本1.10中添加,使此操作更加优雅. (2认同)

NPE*_*NPE 12

以下内容如何:

c = concatenate((a[:,:,:,None],b[:,:,:,None]), axis=3)
Run Code Online (Sandbox Code Playgroud)

这给出了一个(3 x 4 x 5 x 2)阵列,我相信这个阵列是按照你需要的方式布局的.

在这里,None它是Numpy的同义词np.newaxis:我应该使用newaxis还是None?

编辑根据@Joe Kington的建议,可以使用省略号清除代码:

c = concatenate((a[...,None],b[...,None]), axis=3)
Run Code Online (Sandbox Code Playgroud)


8on*_*ne6 8

上面接受的答案很棒.但因为我是个白痴的数学,我会添加以下,这是一个很好用的事实a.shapea.T.shape[::-1]...即走转反转一个numpy的数组的索引的顺序.因此,如果您将构建块放在名为blocks的数组中,那么上面的解决方案是:

new = np.concatenate([block[..., np.newaxis] for block in blocks],
                     axis=len(blocks[0].shape))
Run Code Online (Sandbox Code Playgroud)

但你也可以这样做

new2 = np.array([block.T for block in blocks]).T
Run Code Online (Sandbox Code Playgroud)

我认为读得更干净.值得注意的是,已经接受的答案运行得更快:

%%timeit
new = np.concatenate([block[..., np.newaxis] for block in blocks],
                     axis=len(blocks[0].shape))
1000 loops, best of 3: 321 µs per loop
Run Code Online (Sandbox Code Playgroud)

%%timeit
new2 = np.array([block.T for block in blocks]).T
1000 loops, best of 3: 407 µs per loop
Run Code Online (Sandbox Code Playgroud)