考虑以下脚本:
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。
答案 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