2

我尝试使用此链接解决我的问题,描述 numpy 广播,但无济于事。如何减去以下numpy数组:

X = np.array([[[1,2,3,4],[1,2,3,4],[1,2,3,4]],
              [[4,3,2,1],[4,3,2,1],[4,3,2,1]]])
X_mean = np.average(X_, axis=1)

当我这样做X - X_mean时:

ValueError: operands could not be broadcast together with shapes (2,3,4) (2,4) 

但是这样做X[0] - X_mean[0]会给出正确的输出:

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
4

2 回答 2

3

您需要保持尺寸对齐broadcasting才能发生。你有 -

In [4]: whos
Variable   Type       Data/Info
-------------------------------
X          ndarray    2x3x4: 24 elems, type `int64`, 192 bytes
X_mean     ndarray    2x4: 8 elems, type `float64`, 64 bytes
  1. Axis-0ofX_mean已经与axis-0of对齐X,所以一切都很好。

  2. Axis-1ofX_meanaxis-2of对齐,因此为那里X放置一个新轴,以便可以回.X_meanNone/np.newaxisaxis-1axis-2

让我们验证形状对齐 -

In [7]: X_mean3D = X_mean[:,None,:]

In [8]: whos
Variable   Type       Data/Info
-------------------------------
X          ndarray    2x3x4: 24 elems, type `int64`, 192 bytes
X_mean     ndarray    2x4: 8 elems, type `float64`, 64 bytes
X_mean3D   ndarray    2x1x4: 8 elems, type `float64`, 64 bytes

然后,执行将引入广播的减法 -

In [5]: X - X_mean[:,None,:]
Out[5]: 
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
于 2015-12-24T06:23:18.183 回答
0

作为补充:根据Numpy 广播规则

当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时

  • 他们是平等的
  • 其中之一是 1

所以最好的办法是以在轴 0 上取平均值的方式来塑造数据。

在你的情况下:

Y=np.rollaxis(X,1) # reshape (3,2,4)

Y-Y.mean(0)现在是直接

array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
于 2015-12-24T09:24:50.320 回答