np.isnan() == False,但 np.isnan() 不是 False
Posted
技术标签:
【中文标题】np.isnan() == False,但 np.isnan() 不是 False【英文标题】:np.isnan() == False, but np.isnan() is not False 【发布时间】:2017-07-05 18:13:54 【问题描述】:据我所知,==
检查值是否相等,is
检查值背后的结构的身份(例如,在某些其他语言中为 ===
)。
鉴于此,我不明白以下内容:
np.isnan(30) == False
Out[19]:
True
np.isnan(30) is False
Out[20]:
False
其他身份检查似乎并非如此:
(5 == 4) == False
Out[22]:
True
(5 == 4) is False
Out[23]:
True
似乎np.isnan()
将False
作为值返回,而不是作为标识返回。为什么会这样?
【问题讨论】:
你不应该首先测试False
或True
。使用if np.isnan(..)
和if not np.isnan(..)
。没有要求 Python 解释器只使用布尔值对象的 1 个副本,显然 Numpy 没有。
@MartijnPieters 看起来更像是一种风格评论(我很欣赏),但不能作为函数行为的答案?
(也就是说,虽然我不应该不做那个操作,但我应该可以做。不是吗?)
@FooBar 是否是这种情况完全取决于实现,所以不,你不应该能够做到。跨度>
... 或者更确切地说,这种行为直接说明了为什么你不应该这样做。
【参考方案1】:
np.isnan(30)
return
s np.False_
与False
的身份不同;不过不要依赖这个。
>>> import numpy as np
>>> np.isnan(30) is np.False_
True
>>> np.False_ is False
False
>>>
【讨论】:
【参考方案2】:numpy.isnan()
返回一个兼容类型的对象:
>>> import numpy
>>> type(numpy.isnan(0))
<class 'numpy.bool_'>
这是一个自定义布尔值,可以有效地存储在 numpy 数组中,请参阅Numpy's Data Types documentation。 numpy.isnan()
函数也可以对数组进行操作,生成另一个数组并得到结果:
>>> numpy.isnan(numpy.array([1, 2]))
array([False, False], dtype=bool)
dtype
又是 Numpy 布尔对象。
Python 不保证布尔运算必须始终返回单例布尔值。您永远不应该测试is True
或is False
无论如何。在布尔运算中直接使用numpy.isnan()
输出,使用not
测试假值:
if numpy.isnan(foo):
和
if not numpy.isnan(bar):
【讨论】:
这是一次令人着迷的尝试。我发现numpy还有一个bool
函数,和builtins.bool
一样。 挠头。所以numpy.bool_
是numpy 的布尔值,而numpy.bool
是Python 的布尔值。
@kojiro:那是.. 可能是泄露的全球。
所以说我们__all__
。
@kojiro:this line imports it。不知道为什么他们觉得有必要让这些变得可访问。也许是遗留支持,以前可以使用这些名称获得 dtypes。 original commit里没有解释。
确实是遗产。起初 numpy.bool
是 numpy 标量类型,但在有人指出这将在完成 from numpy import *
时覆盖内置函数(当时更常见)后,它很快被重命名为 numpy.bool_
。但到那时,已经有使用dtype=numpy.bool
等的代码。所以名称仍然存在,就像对内置函数的概括一样。以上是关于np.isnan() == False,但 np.isnan() 不是 False的主要内容,如果未能解决你的问题,请参考以下文章