np.isnan()== False,但是np.isnan()不是False

Foo*_*Bar 1 python boolean numpy python-3.5

据我所知,==检查价值是否相等,并is检查价值背后的结构的身份(例如===在其他一些语言中).

鉴于此,我不明白以下内容:

np.isnan(30) == False
Out[19]: 
True
np.isnan(30) is False
Out[20]: 
False
Run Code Online (Sandbox Code Playgroud)

其他身份检查似乎并非如此:

(5 == 4) == False
Out[22]: 
True
(5 == 4) is False
Out[23]: 
True
Run Code Online (Sandbox Code Playgroud)

看起来好像是作为值np.isnan()返回False,而不是作为标识返回.为什么会这样?

Mar*_*ers 8

numpy.isnan()返回兼容的类型对象:

>>> import numpy
>>> type(numpy.isnan(0))
<class 'numpy.bool_'>
Run Code Online (Sandbox Code Playgroud)

这是一个可以在numpy数组中高效存储的自定义布尔值,请参阅Numpy的数据类型文档.该numpy.isnan()函数也可以在数组上运行,产生另一个带有结果的数组:

>>> numpy.isnan(numpy.array([1, 2]))
array([False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

dtype是Numpy布尔对象.

Python不保证布尔操作必须始终返回单例布尔值.你永远不应该测试is Trueis False 无论如何.numpy.isnan()在布尔运算中直接使用输出,用于not测试错误值:

if numpy.isnan(foo):
Run Code Online (Sandbox Code Playgroud)

if not numpy.isnan(bar):
Run Code Online (Sandbox Code Playgroud)

  • 遗产,的确如此.起初`numpy.bool`是numpy标量类型,但在指出`from numpy import*`完成时会覆盖内置函数时,它很快被重命名为`numpy.bool_`(更常见的是然后).但到那时已经有了使用`dtype = numpy.bool`等的代码.所以这个名字仍然存在,就像内置函数的再现一样. (2认同)