我有两个三维Numpy数组(3 x 4 x 5),我希望将它们连接起来,使得结果变成一个四维数组(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!
为了澄清,我希望c[:,:,:,0]
和c[:,:,:,1]
对应于原始的两个数组。
怎么样呢
c = np.stack((a,b), axis=3)
这里是您需要的:
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)
...
操作符感到无知了。 - Marijn van Vlietc = np.concatenate([aux[..., np.newaxis] for aux in sequence_of_arrays], axis=3)
。 - Tom Pohlaxis=-1
,而不管其具有多少维。 - 1''以下怎么样:
c = concatenate((a[:,:,:,None],b[:,:,:,None]), axis=3)
这将提供一个(3 x 4 x 5 x 2)的数组,我认为它是按照你所需要的方式布局的。
在这里,None
与np.newaxis
是同义词:Numpy: Should I use newaxis or None?
编辑 如@Joe Kington所建议的那样,可以通过使用省略号来简化代码:
c = concatenate((a[...,None],b[...,None]), axis=3)
np.newaxis
,而不是None
。+1分给你 - JoshAdela.shape
等于 a.T.shape[::-1]
的事实的方法...即,对一个 numpy 数组进行转置可以颠倒其索引的顺序。所以,如果你有一个名为 blocks 的数组存储了你的基本模块,则上面的解决方案如下:new = np.concatenate([block[..., np.newaxis] for block in blocks],
axis=len(blocks[0].shape))
new2 = np.array([block.T for block in blocks]).T
我认为这种写法更加清晰易懂。值得注意的是,已经被接受的答案运行速度更快:
%%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
当
%%timeit
new2 = np.array([block.T for block in blocks]).T
1000 loops, best of 3: 407 µs per loop
c = numpy.array([a,b])
虽然如果按照你的方式工作会很好,但这样也可以。
这不一定是最优雅的,但我已经使用了各种变化
c = rollaxis(array([a,b]), 0, 4)
过去。