在新维度上"堆叠"数组?

3
请参考以下内容:

考虑以下情况:

>>> 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)。但是假设我想要这些最内层元素并排放置(仅当源数组的每个维度都相同时才能起作用,包括我想要“堆叠”的维度),则产生的形状为(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的维度:

def pad(npa):
    return npa.reshape(npa.shape[:-1] + (1, npa.shape[-1]))

np.concatenate((pad(x), pad(y), pad(x), pad(y)), axis=2) # does what I want
# np.hstack might be better? I always want the second-last dimension, now

但我觉得自己在重复造轮子。我有没有忽略掉更直接的方法?
1个回答

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.]]]])
>>> 

1
这里没有广播,你只是使用newaxis添加了一个维度。 - Bi Rico
1
我建议删除任何使用“None”添加轴的引用。这是不好的实践。np.newaxis才是正确的方法。格言是“明确表达”:命名就是一切,或者至少很重要。请查看这行神奇的代码 - eickenberg
@eickenberg,文档中也有:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis。Bi Rico,你是对的,我当时在自动编辑。 - YXD
@BiRico 显然,这是一种比我笨拙地组合起来更简单的添加维度的方式。 :) - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接