在Python中可以执行以下操作;
>>> 3 < 4 < 5
True
>>> 3 < 4 < 4
False
这是如何工作的?我本以为4 < 5
会返回一个布尔值,所以3 < True
应该返回False
,或者3 < 4
应该返回一个布尔值,所以True < 4
应该返回True
,如果True
可以被转换为整数1?
为什么它不能为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
只求值一次(但是当x < y
被发现为假时,z
根本不求值)。
所以你的例子相当于:
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()
不能简化为使用比较链
我正在尝试这样做,并提出了以下可能的次优解决方案。
import numpy as np
a = np.arange(20)
(a > 3).__and__(a < 15)
这给出了我想从3 < a < 15
得到的答案。