阵列具有以下尺寸:
dists
:( 500,5000)
train
:( 5000,)
test
:( 500)
为什么前两个语句会抛出错误,而第三个语句可以正常工作?
dists += train + test
错误:ValueError: operands could not be broadcast together with shapes (5000,) (500,)
dists += train.reshape(-1,1) + test.reshape(-1,1)
错误:ValueError: operands could not be broadcast together with shapes (5000,1) (500,1)
dists += train + test.reshape(-1,1)
这很好用!为什么会这样?
答案 0 :(得分:2)
与NumPy的广播规则有关。引用NumPy手册:
在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。
时兼容两个维度
- 他们是平等的,或
- 其中一个是1
第一个语句会抛出错误,因为NumPy会查看唯一的维度,而(5000,)
和(500,)
是不相等的,无法一起广播。
在第二个声明中,train.reshape(-1,1)
的形状为(5000,1)
,test.reshape(-1,1)
的形状为(500,1)
。尾随维度(长度为1)是相同的,因此可以,但是NumPy会检查另一个维度5000 != 500
,因此广播在这里失败。
在第三种情况下,您的操作数为(5000,)
和(500,1)
。在这种情况下,NumPy 允许广播。 1D阵列沿着2D阵列的尾随长度1维扩展。
FWIW,形状和广播规则有时候有点棘手,而且我经常对类似的事情感到困惑。