Получите среднее значение, избегая нано, используя numpy в python

Как рассчитать среднее значение массива (A), избегая nan?

import numpy as np 
A = [5    nan    nan    nan    nan  10]
M = np.mean(A[A!=nan]) does not work
Any idea?

Ответ 1

Используйте numpy.isnan:

>>> import numpy as np 
>>> A = np.array([5, np.nan, np.nan, np.nan, np.nan, 10])
>>> np.isnan(A)
array([False,  True,  True,  True,  True, False], dtype=bool)
>>> ~np.isnan(A)
array([ True, False, False, False, False,  True], dtype=bool)
>>> A[~np.isnan(A)]
array([  5.,  10.])
>>> A[~np.isnan(A)].mean()
7.5

потому что вы не можете сравнить nan с nan:

>>> np.nan == np.nan
False
>>> np.nan != np.nan
True
>>> np.isnan(np.nan)
True

Ответ 2

Другая возможность заключается в следующем:

import numpy
from scipy.stats import nanmean # nanmedian exists too, if you need it
A = numpy.array([5, numpy.nan, numpy.nan, numpy.nan, numpy.nan, 10])
print nanmean(A) # gives 7.5 as expected

Я думаю, что это выглядит более элегантным (и читаемым), чем другое заданное решение

edit: по-видимому (@Jaime) сообщает, что эта функциональность уже существует непосредственно в последней версии numpy (1.8), поэтому больше не нужно import scipy.stats, если у вас есть эта версия numpy:

import numpy
A = numpy.array([5, numpy.nan, numpy.nan, numpy.nan, numpy.nan, 10])
print numpy.nanmean(A) 

первое решение работает также для людей, у которых нет последней версии numpy (например, я)