在Numpy中,NaN被视为相等的吗?

6
考虑以下脚本:
import numpy as np

a = np.array([np.nan], dtype=float)
b = np.array([np.nan], dtype=float)
print a == b

a = np.array([np.nan], dtype=object)
b = np.array([np.nan], dtype=object)
print a == b

在我的机器上,这将打印出

[False]
[ True]

第一个情况很清楚(根据IEEE-754标准),但第二个情况怎么回事?为什么这两个NaN相等呢?
Python 2.7.3,Numpy 1.6.1在Darwin上。

1
在第二种情况下,所有的nan对象都是相等的。 - Daniel
2
@Daniel:根据经验,似乎是这样的,但是:(1)违反IEEE-754的理由是什么?(2)这是否有记录在案? - NPE
一个简单的可能性就是list做的就是这个:x = [numpy.nan]; x == x #>>> True - Veedrac
1个回答

8

在较新版本的numpy中,您会收到以下警告:

FutureWarning: numpy equal will not check object identity in the future. The comparison did not return the same result as suggested by the identity (`is`)) and will change.

我猜测NumPy在对object类型进行比较时,会先使用id测试作为快捷方式,然后才会回退到__eq__测试,因此...

>>> id(np.nan) == id(np.nan)
True

它返回真。

如果你使用float('nan')而非np.nan,结果会有所不同:

>>> a = np.array([np.nan], dtype=object)
>>> b = np.array([float('nan')], dtype=object)
>>> a == b
array([False], dtype=bool)
>>> id(np.nan) == id(float('nan'))
False

我喜欢这个假设,谢谢。我认为把这种行为描述为 bug 也不算不合理。 - NPE
2
您的示例有误:id(4.5)==id(float('4.5'))也是False - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接