Python :在 python 中计算几何平均数的简单方法?

Python : easy way to do geometric mean in python?

我想知道是否有任何简单的方法可以使用 python 但不使用 python 包来计算几何平均数。如果没有,有没有做几何平均的简单包?

就这样做:

numbers = [1, 3, 5, 7, 10]


print reduce(lambda x, y: x*y, numbers)**(1.0/len(numbers))

几何平均数的公式为:

所以你可以很容易地写出这样的算法:

<b>import numpy as np</b>

def geo_mean(iterable):
    a = <b>np.array(iterable)</b>
    return a.<b>prod()</b>**(1.0/len(a))

您不必为此使用 numpy,但它往往比 Python 更快地对数组执行操作。参见 this answer for why

万一溢出的几率高,可以先将数字映射到log域,计算这些数的和日志,然后乘以 1/n 最后计算指数,如:

import numpy as np

def geo_mean<b>_overflow</b>(iterable):
    return np.exp(<b>np.log(iterable)</b>.<b>mean()</b>)

万一有人在这里寻找库实现,scipy 中有 gmean(),可能比自定义实现更快且数值更稳定:

>>> from scipy.stats import gmean
>>> gmean([1.0, 0.00001, 10000000000.])
46.415888336127786

兼容 Python 2 和 3。*

开始 Python 3.8,标准库附带 geometric_mean function as part of the statistics 模块:

from statistics import geometric_mean

geometric_mean([1.0, 0.00001, 10000000000.]) # 46.415888336127786

这里有一个 overflow-resistant 纯 Python 版本,与 基本相同。

import math

def geomean(xs):
    return math.exp(math.fsum(math.log(x) for x in xs) / len(xs))
几何平均数
import pandas as pd
geomean=Variable.product()**(1/len(Variable))
print(geomean)
Scipy
的几何平均数
from scipy import stats
print(stats.gmean(Variable))

你也可以用numpy计算几何平均数:

import numpy as np
np.exp(np.mean(np.log([1, 2, 3])))

结果:

1.8171205928321397

可以使用pow函数,如下:

def p(*args):
    k=1
    for i in args:
        k*=i
    return pow(k, 1/len(args))]

>>> p(2,3)
2.449489742783178