NaNs在Numpy中的比较相等

时间:2014-11-29 21:03:06

标签: python numpy nan ieee-754 multidimensional-array

考虑以下脚本:

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]

第一种情况很清楚(as per IEEE-754),但在第二种情况下会发生什么?为什么两个NaN比较相等?

Python 2.7.3,关于达尔文的Numpy 1.6.1。

1 个答案:

答案 0 :(得分:7)

在较新版本的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正在使用id测试作为object类型的快捷方式,然后再回到__eq__测试,以及

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

它返回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