为什么 "ndarray.all() is False" 在 python 中总是 returns False?

Why does "ndarray.all() is False" always returns False in python?

想知道 python 中的逻辑。当在 numpy 数组上使用 any() 或 all() 并使用 is False/True 时,我总是得到 False,但是当使用“==”时,我得到了我期望的答案。 所以

import numpy as np
a = np.array([True,False,True])
a.any() is False 
>False
a.any() is True
>False

但是这按预期工作

a.any() == True
>True
a.any() == False
>False

is 运算符正在比较对象是否相同(具有相同的 id)。 == 运算符比较两个 。您可以看到值是相同的 (True),但 id 不同。参见:

In [4]: id(True)
Out[4]: 140734689232720

In [5]: id(a.any())
Out[5]: 140734684830488

所以您看到的是两个不同的对象,它们具有相似的人类可读打印值“True”。正如 AKX 指出的那样,这两个对象属于不同类型:Trueboola.any()numpy.bool_.

关于将值与布尔值进行比较的注意事项

作为旁注,您通常不想将布尔值与 is 进行比较,因此没有

if a.any() is False:
   # do something

这是一个完美的例子,为什么不呢。一般来说,如果值为 ,而不是 True,您就会感兴趣。此外,即使使用 == operator:

与 boolean 进行比较也没有意义
if a.any() == False:
   # do something

相反,pythonic 的方式是只写

if not a.any():
   # do something

Numpy 操作return Numpy 类型。

>>> import numpy as np
>>> a = np.array([True,False,True])
>>> a.any()
True
>>> type(a.any())
<class 'numpy.bool_'>

永远不要使用 is 进行比较(除非您知道您确实需要它,这种情况很少见)。