用numpy.NAN初始化数组的奇怪发现
我在用numpy.NAN初始化一个numpy数组的时候遇到了一些问题,如下所示。
>>> import numpy
>>> a = numpy.zeros(2)
>>> a
array([ 0., 0.])
>>> a[:] = numpy.NAN
>>> a
array([ nan, nan])
>>> a[0] is numpy.NAN
False
这是为什么呢?我尝试用NAN初始化一个单独的变量,结果发现这个变量是numpy.NAN,返回值是True。那么,当NAN被赋值给一个数组时,会发生什么呢?
还有一个问题是,当数组中的某些元素是NAN时,我该如何把它们和其他元素区分开来呢?非常感谢!
1 个回答
9
这是一个NaN(不是一个数字)。问题在于,is
在NumPy数组中的工作方式和你想象的不一样。当你赋值时,
a[:] = numpy.NAN
NumPy实际上并不是用对numpy.NAN
对象的引用来填充a
。相反,它是在C语言层面上用带有NaN值的双精度浮点数来填充数组。
当你访问数组中的某个元素,比如a[0]
时,NumPy并没有记录最初用来初始化这个单元格的对象。它只知道这个数值。为了包装这个值,它需要构造一个新的Python对象,而这个新的包装对象和numpy.NAN
并不是同一个对象。因此,is
的检查返回False
。
需要注意的是,通常用is
来比较数字并不是个好主意。你通常想要的是用==
来比较它们的数值。不过,==
对于NaN也会返回False
,所以你需要用numpy.isnan
来处理:
>>> numpy.isnan(a[0])
True
>>> numpy.isnan(a)
array([ True, True], dtype=bool)