请参考以下内容:
我们已经沿着最内层维度堆叠了数组,合并后的形状是
但我觉得自己在重复造轮子。我有没有忽略掉更直接的方法?
考虑以下情况:
>>> 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
但我觉得自己在重复造轮子。我有没有忽略掉更直接的方法?
np.newaxis
才是正确的方法。格言是“明确表达”:命名就是一切,或者至少很重要。请查看这行神奇的代码。 - eickenberg