2014-01-14 5 views
3

Первые вещи первых: это не является дубликатом NumPy: calculate averages with NaNs removed, я объясню, почему:питон NumPy среднем с NaNs

Предположим, у меня есть массив

a = array([1,2,3,4]) 

, и я хочу, чтобы усреднить его весы

weights = [4,3,2,1] 
output = average(a, weights=weights) 
print output 
    2.0 

ok. Так что это довольно просто. Но теперь у меня есть что-то вроде этого:

a = array([1,2,nan,4]) 

расчета в среднем с обычным методом доходности конечно nan. Могу ли я избежать этого? В принципе я хочу, чтобы игнорировать пренебрежимо малых, так что я хотел бы иметь что-то вроде этого:

a = array([1,2,4]) 
weights = [4,3,1] 
output = average(a, weights=weights) 
print output 
    1.75 

ответ

7

сначала выяснить, индексы, где элементы не являются nan, а затем передать отфильтрованные версии a и weights к numpy.average:

>>> import numpy as np 
>>> a = np.array([1,2,np.nan,4]) 
>>> weights = np.array([4,3,2,1]) 
>>> indices = np.where(np.logical_not(np.isnan(a)))[0] 
>>> np.average(a[indices], weights=weights[indices]) 
1.75 

Как было предложено @mtrw в комментариях, было бы чище использовать замаскированную массив здесь вместо индекса массива:

>>> indices = ~np.isnan(a) 
>>> np.average(a[indices], weights=weights[indices]) 
1.75 
+0

спасибо, это работает! – wa4557

+2

+1, хотя я думаю, что 'indices = ~ np.isnan (a)' выглядит лучше (а для огромного 'a' может быть быстрее). – mtrw

+0

@mtrw Это, безусловно, выглядит лучше, обновит мой ответ. Благодарю. –

6

Кроме того, вы можете использовать MaskedArray, как например:

 
>>> import numpy as np 

>>> a = np.array([1,2,np.nan,4]) 
>>> weights = np.array([4,3,2,1]) 
>>> ma = np.ma.MaskedArray(a, mask=np.isnan(a)) 
>>> np.ma.average(ma, weights=weights) 
1.75 
Смежные вопросы