Получите среднее значение, избегая нано, используя 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
(например, я)