为什么 "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 指出的那样,这两个对象属于不同类型:True
是 bool
但 a.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
进行比较(除非您知道您确实需要它,这种情况很少见)。
想知道 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 指出的那样,这两个对象属于不同类型:True
是 bool
但 a.any()
是 numpy.bool_
.
关于将值与布尔值进行比较的注意事项
作为旁注,您通常不想将布尔值与 is
进行比较,因此没有
if a.any() is False:
# do something
这是一个完美的例子,为什么不呢。一般来说,如果值为 True
,您就会感兴趣。此外,即使使用 ==
operator:
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
进行比较(除非您知道您确实需要它,这种情况很少见)。