在Numpy中,我可以像这样生成一个布尔数组:
>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> arr > 2
array([False, False, False, False, True, True, True], dtype=bool)
是否可以将比较链接在一起?例如:
>>> 6 > arr > 2
array([False, False, False, False, True, False, False], dtype=bool)
答案 0 :(得分:19)
AFAIK离你最近的就是使用&
,|
和^
:
>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> (2 < arr) & (arr < 6)
array([False, False, False, False, True, False, False], dtype=bool)
>>> (2 < arr) | (arr < 6)
array([ True, True, True, True, True, True, True], dtype=bool)
>>> (2 < arr) ^ (arr < 6)
array([ True, True, True, True, False, True, True], dtype=bool)
我认为你不能让a < b < c
- 风格链接起作用。
答案 1 :(得分:9)
您可以使用numpy逻辑运算符执行类似的操作。
>>> arr = np.array([1, 2, 1, 2, 3, 6, 9])
>>> arr > 2
array([False, False, False, False, True, True, True], dtype=bool)
>>>np.logical_and(arr>2,arr<6)
Out[5]: array([False, False, False, False, True, False, False], dtype=bool)
答案 2 :(得分:0)
在numpy中不允许进行链式比较。您需要分别编写左右比较,并用bitwise operators链接它们。此外,由于operator precendence(|
,&
和^
的优先级较高),您还需要在两个表达式之间加上括号。在这种情况下,由于要同时满足两个条件,因此需要按位与(&
):
(2<arr) & (arr<6)
# array([False, False, False, False, True, False, False])
实际上建议在PEP 535中使之成为可能,尽管仍然推迟。其中解释了为什么发生这种情况。正如问题所提出的那样,以这种方式进行链式比较会得出:
2<arr<6
ValueError:具有多个元素的数组的真值不明确。 使用a.any()或a.all()
这里的问题是python在内部将上述内容扩展到:
2<arr and arr<6
这是导致错误的原因,因为and
隐式调用bool
,而NumPy
仅允许将隐式强制转换为单个元素的布尔值(不适用于带有{{1}的数组}),因为具有许多值的布尔数组不会求值为size>1
或True
。由于这种歧义,不允许这样做,并且在布尔上下文中评估数组始终会产生False