Python \ Numpy:将数组与NAN进行比较

时间:2014-05-22 14:56:07

标签: python numpy

为什么以下两个列表不相等?

a = [1.0, np.NAN] 
b = np.append(np.array(1.0), [np.NAN]).tolist()

我使用以下内容来检查相同性。

((a == b) | (np.isnan(a) & np.isnan(b))).all(), np.in1d(a,b)

使用np.in1d(a, b)似乎np.NAN值不相等,但我不确定为什么会这样。任何人都可以对这个问题有所了解吗?

3 个答案:

答案 0 :(得分:5)

NaN值永远不会相等。也就是说,根据NaN==NaN 的定义,测试False始终为NaN

所以[1.0, NaN] == [1.0, NaN]也是False。实际上,一旦NaN出现在任何列表中,它就无法与任何其他列表进行比较,甚至本身也是如此。

如果您想测试一个变量以查看它是NaN中的numpy,您可以使用numpy.isnan()功能。我没有看到任何明显的方法来获得你似乎想要的比较语义,而不是通过循环“手动”迭代列表。

请考虑以下事项:

import math
import numpy as np

def nan_eq(a, b):
    for i,j in zip(a,b):
        if i!=j and not (math.isnan(i) and math.isnan(j)):
            return False
    return True

a=[1.0, float('nan')]
b=[1.0, float('nan')]

print( float('nan')==float('nan') )
print( a==a )
print( a==b )
print( nan_eq(a,a) )

它将打印:

False
True
False
True

测试a==a成功,因为据推测,Python的想法是对同一对象的引用等于a==b所要求的元素比较的结果。< / p>

答案 1 :(得分:5)

由于ab是列表,a == b未返回数组,因此类似numpy的逻辑将无效:

>>> a == b
False

您引用的命令仅在数组

时才有效
>>> a,b = np.asarray(a), np.asarray(b)
>>> a == b
array([ True, False], dtype=bool)
>>> (a == b) | (np.isnan(a) & np.isnan(b))
array([ True,  True], dtype=bool)
>>> ((a == b) | (np.isnan(a) & np.isnan(b))).all()
True

应该可以比较两个数组(要么它们都相等,要么它们都是NaN)。

答案 2 :(得分:0)

根据IEEE 754(参见http://en.wikipedia.org/wiki/NaN),在python(和numpy)中实现NaN,并将其定义为不可共享。实际上,这意味着NaN在有序比较操作中永远不会返回True,例如<>==等numpy和buillting math模块提供isnan函数来确定值是否为NaN。