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

时间:2012-01-17 16:50:08

标签: 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!

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

6 个答案:

答案 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)阵列,我相信它是按照你需要的方式布局的。

此处,Nonenp.newaxis同义:Numpy: Should I use newaxis or None?

编辑正如@Joe Kington所建议的那样,使用省略号可以清除代码:

c = concatenate((a[...,None],b[...,None]), axis=3)

答案 3 :(得分:8)

上面接受的答案很棒。但是我会添加以下内容,因为我是一个数学笨蛋,它很好地利用了a.shapea.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)

过去。