What might be the cause of 'invalid value encountered in less_equal' in numpy
Adding to the above answers another way to suppress this warning is to use numpy.less
explicitly, supplying the where
and out
parameters:
np.less([1, 2], [2, np.nan])
outputs: array([ True, False])
causing the runtime warning,
np.less([1, 2], [2, np.nan], where=np.isnan([2, np.nan])==False)
does not calculate result for the 2nd array element according to the docs leaving the value undefined (I got True output for both elements), while
np.less([1, 2], [2, np.nan], where=np.isnan([2, np.nan])==False, out=np.full((1, 2), False)
writes the result into an array pre-initilized to False (and so always gives False in the 2nd element).
This happens due to Nan
values in dataframe, which is completely fine with DF.
In Pycharm, This worked like a charm for me:
import warnings
warnings.simplefilter(action = "ignore", category = RuntimeWarning)
That's most likely happening because of a np.nan
somewhere in the inputs involved. An example of it is shown below -
In [1]: A = np.array([4, 2, 1])
In [2]: B = np.array([2, 2, np.nan])
In [3]: A<=B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: array([False, True, False], dtype=bool)
For all those comparisons involving np.nan
, it would output False
. Let's confirm it for a broadcasted
comparison. Here's a sample -
In [1]: A = np.array([4, 2, 1])
In [2]: B = np.array([2, 2, np.nan])
In [3]: A[:,None] <= B
RuntimeWarning: invalid value encountered in less_equal
Out[3]:
array([[False, False, False],
[ True, True, False],
[ True, True, False]], dtype=bool)
Please notice the third column in the output which corresponds to the comparison involving third element np.nan
in B
and that results in all False
values.
As a follow-up to Divakar's answer and his comment on how to suppress the RuntimeWarning
, a safer way is suppressing them only locally using with np.errstate()
(docs): it is good to generally be alerted when comparisons to np.nan
yield False
, and ignore the warning only when this is really what is intended. Here for the OP's example:
with np.errstate(invalid='ignore'):
center_dists[j] <= center_dists[i]
Upon exiting the with
block, error handling is reset to what it was before.
Instead of invalid value encountered
, one can also ignore all errors by passing all='ignore'
. Interestingly, this is missing from the kwargs
in the docs for np.errstate()
, but not in the ones for np.seterr()
. (Seems like a small bug in the np.errstate()
docs.)