Comparing numpy arrays containing NaN
Alternatively you can use numpy.testing.assert_equal
or numpy.testing.assert_array_equal
with a try/except
:
In : import numpy as npIn : def nan_equal(a,b):...: try:...: np.testing.assert_equal(a,b)...: except AssertionError:...: return False...: return TrueIn : a=np.array([1, 2, np.NaN])In : b=np.array([1, 2, np.NaN])In : nan_equal(a,b)Out: TrueIn : a=np.array([1, 2, np.NaN])In : b=np.array([3, 2, np.NaN])In : nan_equal(a,b)Out: False
Edit
Since you are using this for unittesting, bare assert
(instead of wrapping it to get True/False
) might be more natural.
For versions of numpy prior to 1.19, this is probably the best approach in situations that don't specifically involve unit tests:
>>> ((a == b) | (numpy.isnan(a) & numpy.isnan(b))).all()True
However, modern versions provide the array_equal
function with a new keyword argument, equal_nan
, which fits the bill exactly.
This was first pointed out by flyingdutchman; see his answer below for details.
The easiest way is use numpy.allclose()
method, which allow to specify the behaviour when having nan values. Then your example will look like the following:
a = np.array([1, 2, np.nan])b = np.array([1, 2, np.nan])if np.allclose(a, b, equal_nan=True): print('arrays are equal')
Then arrays are equal
will be printed.
You can find here the related documentation