如何在1D和nD阵列之间广播以获得(1 + n)D阵列输出?

时间:2013-06-04 22:01:47

标签: python numpy

我有一个n维的ndarray z0和一个n维的ndarray za。尺寸不以任何方式彼此对应。我希望能够创建一个新的n + 1维数组z,其中z[i]=z0+za[i]。是否有一些简单的方法来做广播?

这不等同于this question。如果z0是2D,则可以通过以下方式轻松实现:

z0[np.newaxis]+norm.ppf(alphas)[:,None]

但是,无论z0的维度如何,我都需要能够执行此操作,因此只需添加正确数量的Nonenp.newaxis条款就无法使用。

2 个答案:

答案 0 :(得分:3)

怎么样:

z = za.reshape(za.shape + (1,)*z0.ndim) + z0

例如:

import numpy as np
z0 = np.ones((2, 3, 4, 5))
za = np.ones(6)

z = za.reshape(za.shape + (1,)*z0.ndim) + z0

print z.shape
# (6, 2, 3, 4, 5)

答案 1 :(得分:2)

也许像

>>> z0 = np.random.random((2,3,4))
>>> za = np.random.random(5)
>>> z = np.rollaxis((z0[...,None] + za), -1)
>>> z.shape
(5, 2, 3, 4)
>>> [np.allclose(z[i], z0 + za[i]) for i in range(len(za))]
[True, True, True, True, True]

我使用...表示任意数量的维度,rollaxis将其置于我认为您想要的形状中。如果你不介意新轴在最后,我认为你可以放弃z0[..., None] + za