Is there a better way of making numpy.argmin() ignore NaN values
I want to get the index of the min value of a numpy array that contains NaNs and I want them ignored
>>> a = array([ nan, 2.5, 3., nan, 4., 5.])
>>> a
array([ NaN, 2.5, 3. , NaN, 4. , 5. ])
if I run argmin, it returns the index of the first NaN
>>> a.argmin()
0
I substitute NaNs with Infs and then run argmin
>>> a[isnan(a)] = Inf
>>开发者_运维知识库;> a
array([ Inf, 2.5, 3. , Inf, 4. , 5. ])
>>> a.argmin()
1
My dilemma is the following: I'd rather not change NaNs to Infs and then back after I'm done with argmin (since NaNs have a meaning later on in the code). Is there a better way to do this?
There is also a question of what should the result be if all of the original values of a are NaN? In my implementation the answer is 0
Sure! Use nanargmin
:
import numpy as np
a = np.array([ np.nan, 2.5, 3., np.nan, 4., 5.])
print(np.nanargmin(a))
# 1
There is also nansum
, nanmax
, nanargmax
, and nanmin
,
In scipy.stats
, there is nanmean
and nanmedian
.
For more ways to ignore nan
s, check out masked arrays.
精彩评论