【问题标题】:how to calculate geomatic average value with nans?如何用nans计算地理平均值?
【发布时间】:2017-06-04 18:25:34
【问题描述】:

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

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

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

那么如何用geomean来做呢?

【问题讨论】:

标签: python nan geometric-mean


【解决方案1】:

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

这个恒等式可以使用几何平均值的正常定义上的“对数规则”来构造:

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)

而且它似乎有效:

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

在 NumPy 1.10 中还添加了 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)

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2022-11-29
    • 2012-06-19
    相关资源
    最近更新 更多