python - Python 的双面不等式是如何工作的?为什么它不适用于 numpy 数组?
问题描述
在 Python 中,您可以执行以下操作;
>>> 3 < 4 < 5
True
>>> 3 < 4 < 4
False
这是如何运作的?我原以为这4 < 5
会返回一个布尔值,所以3 < True
应该返回False
,或者3 < 4
应该返回一个布尔值,所以如果可以转换为整数 1 ,那么True < 4
应该返回?True
True
为什么它不适用于 numpy 数组?
>>> 1 < np.array([1, 2, 3]) < 3
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
它可以用于 numpy 数组吗?
解决方案
根据Python 文档:
比较可以任意链接,例如,
x < y <= z
等价于x < y and y <= z
,除了y
只评估一次(但在两种情况下 ,当 发现为假z
时根本不评估 )。x < y
所以你的例子相当于:
1 < np.array([1, 2, 3]) and np.array([1, 2, 3]) < 3
所以每个子项都应该产生一个布尔值。但子项:
1 < np.array([1, 2, 3])
产生一个新的 numpy 数组,其中包含:
[False, True, True]
Python 试图将这个值解释为布尔值。它没有这样做,产生错误消息:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我希望这里所需的表达式是:
(1 < np.array([1, 2, 3])).all() and (np.array([1, 2, 3]) < 3).all()
不能简化为使用比较链接。
推荐阅读
- tensorflow - 使用 cv2.dnn.blobFromImage() 将输入输入到 OpenCV DNN
- intellij-idea - IDEA Intellij 版本 2020.1 - Sonarlint 插件在市场上不可用
- ios - 尝试找到的每个建议后,IBOutlet 仍然为零
- oracle - 如何在 18c XE docker 镜像模板中将初始兼容设置为低于 18
- rundeck - Rundeck 作业参考 - 使用变量作为作业名称
- vue.js - v-for 带条件元素,不带
- .net - 为什么我无法从 SQL 查询中获取价值?
- reverse-proxy - FusionAuth 重定向 url IIS 反向代理问题
- oracle - 如何在Oracle中列出所有标记为角色的对象
- kubernetes - Logstash 中的“预期的#, =>”是什么意思?