Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NaNs comparing equal in Numpy

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.

like image 543
NPE Avatar asked Nov 29 '14 21:11

NPE


1 Answers

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
like image 78
behzad.nouri Avatar answered Oct 01 '22 18:10

behzad.nouri