繁体   English   中英

numpy / python中的加权平均值

[英]Weighted mean in numpy/python

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

现在,对于此数组,我想计算此处描述的加权平均值

因为它是连续的,所以我也想为每20个值设置一次中断,即,这些值应该离散为-100 -80 -60...。60 80 100

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

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

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

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

通常一次要问一个问题更好,但是无论如何。

根据您的规范:

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)

对于离散化(中断),这是一种使用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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM