python - 为什么下面的操作数不能一起广播?
问题描述
数组具有以下维度:
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)
这很好用!
为什么会这样?
解决方案
这与 NumPy 的广播规则有关。引用 NumPy 手册:
当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时
- 他们是平等的,或者
- 其中之一是 1
第一条语句会抛出错误,因为 NumPy 只查看维度,并且(5000,)
和(500,)
不相等,不能一起广播。
在第二个语句中,train.reshape(-1,1)
has the shape(5000,1)
和test.reshape(-1,1)
has the shape (500,1)
。尾随维度(长度一)是相等的,所以没关系,但是 NumPy 会检查另一个维度和5000 != 500
,所以广播在这里失败。
在第三种情况下,您的操作数是(5000,)
and (500,1)
。在这种情况下,NumPy确实允许广播。一维数组沿二维数组的尾随长度 1 维扩展。
FWIW,形状和广播规则有时会有点棘手,我经常被类似的事情弄糊涂。
推荐阅读
- ibm-watson - 如何在 watson 对话服务中调用视觉识别 api?
- node.js - 无法识别节点命令
- python - 是否有 os 方法可以生成特定目录的 dictonary=={"folder":[''sub_folder","file1","file2"...]} ?
- regex - ANSIBLE 如何通过正则表达式将 IP 添加到字符串中的现有条目?
- python - 移动和翻转位
- c# - 如果批准,如何保存更改
- python - 从 CSV 读取,将列表值与 CSV 列进行比较
- c# - 将datagridview单元格值设置为行c#的索引号
- python - 使用 BeautifulSoup 处理 pre 标签中的尖括号
- ios - iPhone蓝牙配对无需确认密码