我尝试用link解决我的问题,描述了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.]])
答案 0 :(得分: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
Axis-0
的{li> X_mean
已与axis-0
的{{1}}对齐,所以那里一切都很好。
X
的{{1}} 与Axis-1
的{{1}}对齐,因此请为{{{}添加新轴1}} None/np.newaxis
,X_mean
可以推回到axis-2
。
让我们验证形状对齐 -
X
然后,执行将带来广播的减法 -
X_mean
答案 1 :(得分:0)
作为补充:根据Numpy Broadcasting Rules,
在两个数组上运行时,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.]]])