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 作为值返回,而不是作为标识返回。为什么会这样?

【问题讨论】:

你不应该首先测试FalseTrue。使用if np.isnan(..)if not np.isnan(..)。没有要求 Python 解释器只使用布尔值对象的 1 个副本,显然 Numpy 没有。 @MartijnPieters 看起来更像是一种风格评论(我很欣赏),但不能作为函数行为的答案? (也就是说,虽然我不应该不做那个操作,但我应该可以做。不是吗?) @FooBar 是否是这种情况完全取决于实现,所以,你不应该能够做到。跨度> ... 或者更确切地说,这种行为直接说明了为什么你不应该这样做。 【参考方案1】:

np.isnan(30) returns 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 Trueis 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的主要内容,如果未能解决你的问题,请参考以下文章

numpy通用函数

numpy nan值的判断

错误:无法从 DataFrame 中删除无限值

pandas数据类型判断数据判断

从 X 数组中删除 NaN 行以及 Y 中的相应行

Numpy:检查值是不是为 NaT