首页 > 解决方案 > 给定一个字典字典,其中键是 bin,值是频率,我如何有效地计算 bin 的均值和标准差?

问题描述

我有一个字典字典,其中内部字典的键表示直方图的 bin,值表示频率。我想计算 bin 的平均 bin 和 std。

dict = {'Group 1' : {1 : 100, 2:300, 4:100, 5:50},
       {'Group 2' : {1 : 50, 2: 300},
       {'Group 3' : {4 : 100, 5: 200},
        ...}

示例 对于Group 1我想获得与获取 100 个 1、300 个 2、100 个 4、50 个 5 的列表的平均值和标准相同的平均值和标准差

l = []
l.extend([1 for j in range(0,100)])
l.extend([2 for j in range(0,300)])
l.extend([4 for j in range(0,100)])
l.extend([5 for j in range(0,50)])
np.mean(l) = 2.45
np.std(l) = 1.23

迭代每个字典并对其进行转换以便我得到一个字典字典的最佳方法是什么,该字典表示内部字典的 bin 的均值和标准差?

transformed_dictionary = {'Group 1' : {'mean': 2.45 , 'std' : 1.23},
                          'Group 2' : {...},
                           ...}
   

什么是这样做的有效方法?

标签: pythondictionary

解决方案


为避免构建辅助列表,您可以使用np.averagewithweights=参数:

def weighted_avg_and_std(values, weights):
    """
    Return the weighted average and standard deviation.

    values, weights -- Numpy ndarrays with the same shape.
    """
    average = np.average(values, weights=weights)
    # Fast and numerically precise:
    variance = np.average((values-average)**2, weights=weights)
    return average, np.sqrt(variance)

d = {'Group 1' : {1 : 100, 2:300, 4:100, 5:50},
     'Group 2' : {1 : 50, 2: 300},
     'Group 3' : {4 : 100, 5: 200}}

out = {}
for k, v in d.items():
    m, s = weighted_avg_and_std([*v], [*v.values()])
    out[k] = {
        'mean': m,
        'std': s
    }

print(out)

印刷:

{'Group 1': {'mean': 2.4545454545454546, 'std': 1.2331509060227759}, 
 'Group 2': {'mean': 1.8571428571428572, 'std': 0.3499271061118826}, 
 'Group 3': {'mean': 4.666666666666667, 'std': 0.4714045207910317}}

推荐阅读