[英]Weighted mean in numpy/python
我有一个很大的连续值数组,范围是(-100,100)
现在,对于此数组,我想计算此处描述的加权平均值
因为它是连续的,所以我也想为每20个值设置一次中断,即,这些值应该离散为-100 -80 -60...。60 80 100
我一般如何在NumPy或python中做到这一点?
编辑:这里与正常均值的差异,均值是根据值的频率计算得出的
您实际上有两个不同的问题。
通常一次要问一个问题更好,但是无论如何。
根据您的规范:
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.