Python的双面不等式是如何工作的?为什么它不适用于 Numpy 数组?



在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得到的答案。

相关内容

  • 没有找到相关文章

最新更新