【问题标题】:Why does "ndarray.all() is False" always returns False in python?为什么“ndarray.all() is False”在python中总是返回False?
【发布时间】:2022-01-02 17:45:37
【问题描述】:

想知道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

【问题讨论】:

  • 因为any 的返回值将永远TrueFalse 相同,它们是bool 类型的语言保证单例,而@987654327 @ 总是返回 numpy.bool_ 类型的对象,而不是 bool

标签: python numpy numpy-ndarray


【解决方案1】:

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

这是一个完美的例子,为什么不呢。一般来说,如果值是truthy,而不是True,您会感兴趣。此外,即使使用 == 运算符,与布尔值进行比较也没有意义:

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

相反,pythonic 的方式就是写

if not a.any():
   # do something

【讨论】:

    【解决方案2】:

    Numpy 操作返回 Numpy 类型。

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

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

    【讨论】:

    • 其实,你甚至不需要比较布尔值和布尔值,直接使用布尔值或者取反即可。
    • 是的。或者,如果您出于某种原因需要 Python bool,请使用例如bool(a.any()).
    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多