在新维度中“堆叠”数组?

时间:2014-04-17 21:29:34

标签: python numpy

考虑参考:

>>> x, y = np.ones((2, 2, 2)), np.zeros((2, 2, 2))
>>> np.concatenate((x, y, x, y), axis=2)
array([[[ 1.,  1.,  0.,  0.,  1.,  1.,  0.,  0.],
        [ 1.,  1.,  0.,  0.,  1.,  1.,  0.,  0.]],

       [[ 1.,  1.,  0.,  0.,  1.,  1.,  0.,  0.],
        [ 1.,  1.,  0.,  0.,  1.,  1.,  0.,  0.]]])

我们已经将数组沿着最里面的维度堆叠起来,合并它 - 结果形状为(2, 2, 8)。但是假设我希望那些最里面的元素并排放置(这只会起作用,因为源数组的每个维度都是相同的,包括我想要'堆叠'的那个),产生一个形状为{{{ 1}}如下?

(2, 2, 4, 2)

我最好的方法是首先重塑每个源数组,在最后一个之前添加一个长度的维度:

array([[[[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]],

        [[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]]],


       [[[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]],

        [[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]]]])

但我觉得我正在重新发明轮子。我是否忽视了更直接地做到这一点的事情?

1 个答案:

答案 0 :(得分:4)

您可以按照以下方式执行此操作:

>>> xx = x[..., None, :]
>>> yy = y[..., None, :]
>>> np.concatenate((xx, yy, xx, yy), axis=2).shape
(2, 2, 4, 2)
>>> np.concatenate((xx, yy, xx, yy), axis=2)
array([[[[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]],

        [[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]]],


       [[[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]],

        [[ 1.,  1.],
         [ 0.,  0.],
         [ 1.,  1.],
         [ 0.,  0.]]]])
>>> 

这个例子的作用是改变数组的形状(没有复制数据)。使用None或等效np.newaxis切片会添加轴:

>>> xx.shape
(2, 2, 1, 2)
>>> xx
array([[[[ 1.,  1.]],

        [[ 1.,  1.]]],


       [[[ 1.,  1.]],

        [[ 1.,  1.]]]])
>>>