numpy/python 中的加权平均值

Posted

技术标签:

【中文标题】numpy/python 中的加权平均值【英文标题】:Weighted mean in numpy/python 【发布时间】:2015-07-15 10:15:42 【问题描述】:

我有一个很大的连续值数组,范围从 (-100, 100)

现在我想计算这个数组的加权平均值described here

因为它是连续的,我还想为每 20 次的值设置中断 即值应该是离散的 -100 -80 -60 …… 60 80 100

我一般如何在 NumPy 或 python 中做到这一点?

编辑:这里与正常平均值的差异,即平均值是根据值的频率计算的

【问题讨论】:

Calculating arithmetic mean (average) in Python的可能重复 你能解释一下你所说的休息是什么意思吗? 已经在numpy 中实现为average。检查here 那么函数需要权重是一个已经定义的列表,我的问题中没有提供这个列表,因为这些值是连续的。您可以查看@PascalvKooten 解决方案,它非常简洁。 【参考方案1】:

您实际上有 2 个不同的问题。

    如何使数据离散化,以及 如何进行加权平均。

通常最好一次问 1 个问题,但无论如何。

根据您的规格:

xmin = -100
xmax = 100
binsize = 20

首先,让我们导入 numpy 并制作一些数据:

import numpy as np
data = numpy.array(range(xmin, xmax))

然后让我们制作您正在寻找的分箱:

bins_arange = numpy.arange(xmin, xmax + 1, binsize) 

由此我们可以将数据转换为离散形式:

counts, edges = numpy.histogram(data, bins=bins_arange)

现在要计算加权平均值,我们可以使用分箱中间(例如,-100 和 -80 之间的数字平均为 -90):

bin_middles = (edges[:-1] + edges[1:]) / 2

请注意,与整数除法方法相反,此方法不需要分箱均匀“间隔”。

然后让我们做一些权重:

weights = numpy.array(range(len(counts)) / sum(range(len(counts))

然后把它们放在一起:

average =          np.sum(bin_middles * counts * 1) / sum(counts)
weighted_average = np.sum(bin_middles * counts * weights) / sum(counts)

【讨论】:

【参考方案2】:

对于离散化(breaks),这里有一个使用python整数除法的方法:

import numpy as np
values = np.array([0, 5, 10, 11, 21, 24, 48, 60])
(values/20) *20
# or (a/10).astype(int)*10 to force rounding

将打印:

aarray([ 0,  0,  0,  0, 20, 20, 40, 60])

对于加权平均值,如果您有另一个包含每个点的权重的数组,您可以使用:

weighted_means = sum([ w*v for w,v in zip(weights, values)]) / sum( w*w )

【讨论】:

以上是关于numpy/python 中的加权平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何在r中的循环中引导加权平均值

MySql中的加权平均值

MATLAB在NumPy / Python中的平滑实现(n点移动平均)

使用 NumPy 函数计算 Pandas 中的加权平均值

MATLAB 在 NumPy/Python 中的平滑实现(n 点移动平均)

3 Excel 中的可变加权平均值