数组的维度如下:dists
:(500,5000)train
:(5000,)test
:(500,)
为什么前两个语句会抛出错误,而第三个语句却可以正常工作?
dists += train + test
Error: ValueError: operands could not be broadcast together with shapes (5000,) (500,)
dists += train.reshape(-1,1) + test.reshape(-1,1)
Error: ValueError: operands could not be broadcast together with shapes (5000,1) (500,1)
-
dists += train + test.reshape(-1,1)
这很好用!
为什么会出现这种情况?
这与 NumPy 的广播规则有关。引用 NumPy 手册:
当操作两个数组时,NumPy 按元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时
- 它们是相等的,或者
- 其中之一是 1
第一个语句会抛出错误,因为 NumPy 查看唯一的维度,并且(5000,)
and (500,)
不相等,不能一起广播。
在第二个声明中,train.reshape(-1,1)
有形状(5000,1)
and test.reshape(-1,1)
有形状(500,1)
。尾随维度(长度一)相等,所以没问题,但随后 NumPy 检查另一个维度并5000 != 500
,所以这里广播失败。
在第三种情况下,你的操作数是(5000,)
and (500,1)
。在本例中,NumPydoes允许广播。一维数组沿着二维数组的尾部 length-1 维度延伸。
FWIW,形状和广播规则有时可能有点棘手,我经常对类似的事情感到困惑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)