2010-05-12 2 views
14

Я хочу, чтобы получить индекс мин стоимости Numpy массива, который содержит пренебрежимо малый и я хочу, чтобы они игнорировалиЕсть ли лучший способ сделать numpy.argmin() игнорировать NaN значение

>>> a = array([ nan, 2.5, 3., nan, 4., 5.]) 
>>> a 
array([ NaN, 2.5, 3. , NaN, 4. , 5. ]) 

если я бегу argmin, он возвращает индекс первого NaN

>>> a.argmin() 
0 

я заменить с пренебрежимо малым Infs, а затем запустить argmin

>>> a[isnan(a)] = Inf 
>>> a 
array([ Inf, 2.5, 3. , Inf, 4. , 5. ]) 
>>> a.argmin() 
1 

Моя дилемма такова: Я бы предпочел не менять NaN на Infs, а затем обратно после того, как я закончил с argmin (поскольку NaNs имеют смысл в дальнейшем). Есть лучший способ сделать это?

Существует также вопрос о том, каким должен быть результат, если все исходные значения a являются NaN? В моей реализации ответ 0

ответ

27

Конечно! Используйте nanargmin:

import numpy as np 
a = np.array([ np.nan, 2.5, 3., np.nan, 4., 5.]) 
print(np.nanargmin(a)) 
# 1 

Существует также nansum, nanmax, nanargmax и nanmin,

В scipy.stats, есть nanmean и nanmedian.

For more ways игнорировать nan s, выезд masked arrays.

+0

спасибо ~ unutbu! –

+0

Вы не представляете, как это меня радует. – weronika

Смежные вопросы