python 中字典值的加权平均值
Weighted average of dictionary values in python
我有一个参数网格,由 234 个字典组成,每个字典都有相同的键。然后我有一个权重列表,我想通过它计算这些字典值的加权平均值。换句话说,我只需要获得一个字典,它具有与初始 243 相同的键,但是作为附加到每个键的值的加权平均值,使用 243 个权重。
我尝试使用 Counter
来累积结果,但它 returns 非常小的值,对我来说没有意义。 w[0]
是243个权重的列表,每个权重对应grid
里面的243个字典
from collections import Counter
def avg_grid(grid, w, labels=["V0", "omega", "kappa", "rho", "theta"]):
avgHeston = Counter({label: 0 for label in labels})
for i in range(len(grid)):
avgHeston.update(Counter({label: grid[i][label] * w[0][i] for label in labels}))
totPar = dict(avgHeston)
return totPar
有没有更简单的实现方式?
您可能想改用 defaultdict
:
from collections import defaultdict
def avg_grid(grid, wgts, labels=["V0", "rho"]):
avgHeston = defaultdict(int)
for g,w in zip(grid, wgts):
for label in labels:
avgHeston[label] += g[label] * w
return avgHeston
weights = [4,3]
grd = [{'V0':4,'rho':3}, {'V0':1,'rho':2}]
print(avg_grid(grd, weights))
输出:
defaultdict(<class 'int'>, {'V0': 19, 'rho': 18})
备注:
我已经修改了w
,所以你需要传入一个直列表。您可能想这样调用该函数:avg_grid(grids, w[0])
此外,这不会产生平均值。你可能想在某个时候除以 len(grid)
。
另外 for g,w in zip(grid, wgts):
是一个更 pythonic 的迭代
我有一个参数网格,由 234 个字典组成,每个字典都有相同的键。然后我有一个权重列表,我想通过它计算这些字典值的加权平均值。换句话说,我只需要获得一个字典,它具有与初始 243 相同的键,但是作为附加到每个键的值的加权平均值,使用 243 个权重。
我尝试使用 Counter
来累积结果,但它 returns 非常小的值,对我来说没有意义。 w[0]
是243个权重的列表,每个权重对应grid
from collections import Counter
def avg_grid(grid, w, labels=["V0", "omega", "kappa", "rho", "theta"]):
avgHeston = Counter({label: 0 for label in labels})
for i in range(len(grid)):
avgHeston.update(Counter({label: grid[i][label] * w[0][i] for label in labels}))
totPar = dict(avgHeston)
return totPar
有没有更简单的实现方式?
您可能想改用 defaultdict
:
from collections import defaultdict
def avg_grid(grid, wgts, labels=["V0", "rho"]):
avgHeston = defaultdict(int)
for g,w in zip(grid, wgts):
for label in labels:
avgHeston[label] += g[label] * w
return avgHeston
weights = [4,3]
grd = [{'V0':4,'rho':3}, {'V0':1,'rho':2}]
print(avg_grid(grd, weights))
输出:
defaultdict(<class 'int'>, {'V0': 19, 'rho': 18})
备注:
我已经修改了w
,所以你需要传入一个直列表。您可能想这样调用该函数:avg_grid(grids, w[0])
此外,这不会产生平均值。你可能想在某个时候除以 len(grid)
。
另外 for g,w in zip(grid, wgts):
是一个更 pythonic 的迭代