为什么以下两个列表不相等?
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
值不相等,但我不确定为什么会这样。任何人都可以对这个问题有所了解吗?
答案 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)
由于a
和b
是列表,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。