用numpy.NAN初始化数组的奇怪发现

1 投票
1 回答
1913 浏览
提问于 2025-04-17 22:17

我在用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)

撰写回答