我有两个三维(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)
Dan*_*iel 16
关于什么
c = np.stack((a,b), axis=3)
Run Code Online (Sandbox Code Playgroud)
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)
上面接受的答案很棒.但因为我是个白痴的数学,我会添加以下,这是一个很好用的事实a.shape
是a.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)
归档时间: |
|
查看次数: |
20196 次 |
最近记录: |