Есть ли лучший способ заставить numpy.argmin() игнорировать значения NaN

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

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

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

>>> a.argmin()  
0  

Я заменяю NaN на Infs, а затем запускаю argmin.

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

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

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


person AnalyticsBuilder    schedule 12.05.2010    source источник


Ответы (1)


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

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.

Дополнительные способы игнорировать nans, проверьте маскированные массивы.

person unutbu    schedule 12.05.2010
comment
Вы не представляете, как это меня радует. - person weronika; 24.06.2011