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

t1rydlwq  于 2023-06-06  发布在  Python
关注(0)|答案(2)|浏览(207)

在Python中,你可以做以下事情:

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

这是怎么回事?我认为4 < 5会返回一个布尔值,所以3 < True应该返回False,或者3 < 4应该返回一个布尔值,所以如果True可以转换为整数1,True < 4可能应该返回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数组吗?

wecizke3

wecizke31#

根据Python文档:
比较可以任意链接,例如,x < y <= z等价于x < y and y <= z,除了y只计算一次(但在这两种情况下,当x < y被发现为假时,z根本不计算)。
所以你的例子相当于:
因此每个子项都期望得到布尔值。但副项:
结果是一个新的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()

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

9lowa7mx

9lowa7mx2#

我试图做到这一点,并提出了以下可能是次优的解决方案。

import numpy as np
a = np.arange(20)
(a > 3).__and__(a < 15)

这给出了我想要的3 < a < 15的答案。

相关问题