我有一个一维标量值数组
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]]])
但不确定正确的形状是什么。
答案 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 - Y
或Y = numpy.array([1,2]).reshape(2, 1, 1)
这样的Y,Y = numpy.array([1,2]).reshape(1, 2, 1)
不会返回错误。