如何用nans计算地理平均值?

时间:2017-06-04 08:52:30

标签: python nan geometric-mean

我想计算一些数据的几何平均值(包括NaN),我该怎么做?

我知道如何用NaN计算平均值,我们可以使用以下代码:

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

那么如何使用geomean呢?

1 个答案:

答案 0 :(得分:1)

您可以使用身份(我只在german Wikipedia中找到它,但也可能有其他来源):

enter image description here

可以使用"对数规则"来构建此身份。关于几何平均数的正常定义:

enter image description here

可以选择基本SymPy 1.0,因此您可以使用a(和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中还添加了np.nanprod,因此您也可以使用正常定义:

>>> 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.])