Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a better way of making numpy.argmin() ignore NaN values

Tags:

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

like image 369
AnalyticsBuilder Avatar asked May 12 '10 17:05

AnalyticsBuilder


1 Answers

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 nans, check out masked arrays.

like image 79
unutbu Avatar answered Oct 01 '22 16:10

unutbu