NaNs comparing equal in Numpy

2k Views Asked by At

Consider the following script:

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

On my machine this prints out

[False]
[ True]

The first case is clear (as per IEEE-754), but what's going on in the second case? Why are the two NaNs comparing equal?

Python 2.7.3, Numpy 1.6.1 on Darwin.

1

There are 1 best solutions below

2
On BEST ANSWER

On newer versions of numpy you get this warning:

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.

my guess is that numpy is using id test as a shortcut, for object types before falling back to __eq__ test, and since

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

it returns true.

if you use float('nan') instead of np.nan the result would be different:

>>> 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