我有两个具有三个维度(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!
为了澄清,我希望c[:,:,:,0]
和c[:,:,:,1]
对应原始的两个数组。
答案 0 :(得分: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)
答案 1 :(得分:14)
怎么样?
public static void main(String[] args) {
String filepath = "C:\\Users\\setrivayne\\Downloads\\TEST.docx";
String outpath = "C:\\Users\\setrivayne\\Downloads\\TEST.docx";
try {
WordDocument doc = new WordDocument(filepath);
doc.replace("FIRST NAME", "first name");
doc.replace("MIDDLE NAME", "middle name");
doc.replace("LAST NAME", "last name");
doc.save(outpath, true);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
答案 2 :(得分:12)
以下内容如何:
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)
答案 3 :(得分:8)
上面接受的答案很棒。但是我会添加以下内容,因为我是一个数学笨蛋,它很好地利用了a.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
答案 4 :(得分:1)
这对我有用:
c = numpy.array([a,b])
虽然如果按照自己的方式工作也会很好。
答案 5 :(得分:0)
它不一定是最优雅的,但我使用了
的变体c = rollaxis(array([a,b]), 0, 4)
过去。