2017-06-04 15 views
1

いくつかのデータ(NaNを含む)の幾何平均を計算したいのですが、どうすればいいですか?幾何平均でそれを行うにはどのようにnansでgeomatic平均値を計算する方法は?

import numpy as np 
M = np.nanmean(data, axis=2). 

私はNaNをして平均値を計算する方法を知って、私たちは、次のコードを使用することができますか?

あなたは(私は german Wikipediaでそれを見つけたが、他のソースが同様におそらくあります)IDを使用することができ
+0

https://stackoverflow.com/questions/19852586/get-mean-value-avoiding-nan-using-numpy-in-pythonまたはhtt ps://stackoverflow.com/questions/5480694/numpy-calculate-averages-with-nans-removedより効率的でやや長いバージョンですが、 'mean'を' geomean'に置き換えます – Ryan

答えて

1

enter image description here

このIDは、通常の「対数ルール」を使用して構築することができます幾何平均の定義:

enter image description here

あなたが使用できるようaは、arbitarly選択することができますベースnp.log(逆操作としてnp.exp):

import numpy as np 

def nangmean(arr, axis=None): 
    arr = np.asarray(arr) 
    inverse_valids = 1./np.sum(~np.isnan(arr), axis=axis) # could be a problem for all-nan-axis 
    rhs = inverse_valids * np.nansum(np.log(arr), axis=axis) 
    return np.exp(rhs) 

そして、動作するようです:

numpyの1.10で
>>> l = [[1, 2, 3], [1, np.nan, 3], [np.nan, 2, np.nan]] 

>>> nangmean(l) 
1.8171205928321397 

>>> nangmean(l, axis=1) 
array([ 1.81712059, 1.73205081, 2.  ]) 

>>> nangmean(l, axis=0) 
array([ 1., 2., 3.]) 

あなたはまた、通常の定義を使用することができるようにもnp.nanprodが、追加されました:

import numpy as np 

def nangmean(arr, axis=None): 
    arr = np.asarray(arr) 
    valids = np.sum(~np.isnan(arr), axis=axis) 
    prod = np.nanprod(arr, axis=axis) 
    return np.power(prod, 1./valids) 
関連する問題