numpy/python 中的加权平均值
Weighted mean in numpy/python
我有一个很大的连续值数组,范围从 (-100, 100)
现在对于这个数组我想计算加权平均值described here
因为它是连续的,我还想每 20 次为值设置一次中断
即值应该是离散的
-100
-80
-60
....
60
80
100
我如何在 NumPy 或 python 中执行此操作?
编辑:这里与正常平均值的区别,平均值是根据值的频率计算的
对于离散化(中断),这是使用 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 )
您实际上有 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
请注意,与整数除法相反,此方法不要求分箱均匀 "spaced"。
然后让我们做一些权重:
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)
我有一个很大的连续值数组,范围从 (-100, 100)
现在对于这个数组我想计算加权平均值described here
因为它是连续的,我还想每 20 次为值设置一次中断 即值应该是离散的 -100 -80 -60 .... 60 80 100
我如何在 NumPy 或 python 中执行此操作?
编辑:这里与正常平均值的区别,平均值是根据值的频率计算的
对于离散化(中断),这是使用 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 )
您实际上有 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
请注意,与整数除法相反,此方法不要求分箱均匀 "spaced"。
然后让我们做一些权重:
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)