python中字典值的加权平均值

时间:2018-01-26 14:34:58

标签: python dictionary weighted-average

我有一个参数网格,由234个词典组成,每个人都有相同的键。然后我有一个权重列表,通过它我想要计算这些词典的加权平均值'值。换句话说,我需要只使用一个具有相同键的初始243的字典,但是作为每个键的值,使用243个权重对值进行加权平均。

我尝试使用Counter来累积结果,但它返回的值非常小,对我来说没有意义。 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

有没有更简单的方法来实现它?

1 个答案:

答案 0 :(得分:0)

您可能希望改为使用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迭代