使用广播从3维数组中减去1维数组(标量列表)

时间:2019-01-21 06:45:11

标签: python numpy

我有一个一维标量值数组

Y = np.array([1, 2])

我还有一个3维数组:

X = np.random.randint(0, 255, size=(2, 2, 3))

我正在尝试从Y中减去X的每个值,所以我应该取回Z,其形状应为(2,2,2,3)或( 2,2,2,3)。

我似乎无法弄清楚如何通过广播做到这一点。

我尝试更改Y的更改:

Y = np.array([[[1, 2]]])

但不确定正确的形状是什么。

2 个答案:

答案 0 :(得分:1)

广播在右边排列尺寸。因此,您希望在(2, 1, 1, 1)数组和(2, 2, 3)数组上进行操作。

我能想到的最简单的方法是使用reshape

Y = Y.reshape(-1, 1, 1, 1)

更一般地:

Y = Y.reshape(-1, *([1] * X.ndim))

reshape的最多一个参数可以为-1,表示其他尺寸未考虑的所有剩余尺寸。

要获得形状为Z的{​​{1}}:

(2, 2, 2, 3)

如果您对形状为Z = X - Y.reshape(-1, *([1] * X.ndim)) 的{​​{1}}感到满意,那么操作会简单得多:

Z

(2, 2, 3, 2)Z = X[..., None] - Y 会将单位轴插入None形状的末端,从而使其以1D np.newaxis正确广播。

答案 1 :(得分:0)

我不确定您要在哪个维度上进行减法运算,但是如果您定义X - YY = numpy.array([1,2]).reshape(2, 1, 1)这样的Y,Y = numpy.array([1,2]).reshape(1, 2, 1)不会返回错误。

相关问题