Numpy 的“真”与 Python 的“真”不同,因此is
失败:
>>> import numpy as np
>>> a = np.array([True, True, False])
>>> a[:]
array([ True, True, False], dtype=bool)
>>> a[0]
True
>>> a[0]==True
True
>>> a[0] is True
False
>>> type(a[0])
<type 'numpy.bool_'>
>>> type(True)
<type 'bool'>
此外,具体来说,PEP 8 说不要对布尔值使用 'is' 或 '==':
Don't compare boolean values to True or False using ==:
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
一个空的 numpy 数组确实会像空的 Python 列表或空的 dict 一样测试错误:
>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False]
与 Python 不同,单个 falsey 元素的 numpy 数组确实会测试 false:
>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]]
[True, True, True, False, False]
但是您不能将该逻辑与具有多个元素的 numpy 数组一起使用:
>>> bool(np.array([0,0]))
Traceback (most recent call last):
File "<stdin>", 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 的 PEP 8 的“精神”可能只是测试每个元素的真实性:
>>> np.where(np.array([0,0]))
(array([], dtype=int64),)
>>> np.where(np.array([0,1]))
(array([1]),)
或使用any
:
>>> np.array([0,0]).any()
False
>>> np.array([0,1]).any()
True
请注意,这不是您所期望的:
>>> bool(np.where(np.array([0,0])))
True
由于np.where
返回一个非空元组。