首页 > 解决方案 > Python 的双面不等式是如何工作的?为什么它不适用于 numpy 数组?

问题描述

在 Python 中,您可以执行以下操作;

>>> 3 < 4 < 5
True
>>> 3 < 4 < 4
False

这是如何运作的?我原以为这4 < 5会返回一个布尔值,所以3 < True应该返回False,或者3 < 4应该返回一个布尔值,所以如果可以转换为整数 1 ,那么True < 4应该返回?TrueTrue

为什么它不适用于 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 数组吗?

标签: pythonnumpycomparisonoperatorsboolean-expression

解决方案


根据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()

不能简化为使用比较链接。


推荐阅读