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

时间:2014-03-14 10:13:43

标签: python arrays numpy

我在使用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初始化一个变量,得到var是numpy.NAN为True。将NAN分配给数组时会发生什么?

另一个问题是,当档案中的某些元素是NAN时,我如何将它们与其他元素区分开来?非常感谢!

1 个答案:

答案 0 :(得分:9)

这是一个NaN。只是is不像您认为的那样使用NumPy数组。分配

a[:] = numpy.NAN

NumPy实际上不会向a填充numpy.NAN对象的引用。相反,它使用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)