Pythonic计算计数器中值的均值和方差的方法

dat*_*ata 5 python performance counter

我想知道是否有一种Pythonic方法来计算计数器的均值和方差?

例如,我有四个计数器共享相同的键:

a = Counter({1: 23, 2: 39, 3: 1})
b = Counter({1: 28, 2: 39, 3: 1})
c = Counter({1: 23, 2: 39, 3: 2})
d = Counter({1: 23, 2: 22, 3: 1})
Run Code Online (Sandbox Code Playgroud)

我这样做的方法是:

each_key_val = {}

for i in a.keys():  # The assumption here is that all Counters must share the same keys
    for j in [a, b, c, d]:
        try:
            each_key_val[i].append(j[i])       
        except:
            each_key_val[i] = [j[i]]
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码来查找每个键的均值/方差:

 np.mean(each_key_val[i])
 np.var(each_key_val[i])
Run Code Online (Sandbox Code Playgroud)

与我的方式相比,是否有更简单的方法来计算每个键的均值/方差?

Ami*_*ory 3

这并不是说我认为以下内容比您所拥有的更具可读性,但它仅使用列表理解。

说你有

cs = (a, b, c, d)
Run Code Online (Sandbox Code Playgroud)

然后可以找到均值字典

m = {k: float(d) / len(cs) for k, d in sum(cs).iteritems()}
Run Code Online (Sandbox Code Playgroud)

对于方差,请注意,根据方差的定义 V[X] = E[x 2 ] - (E[X]) 2,因此,如果您定义:

p = sum([Counter({k: ((float(d**2) / len(cs))) for (k, d) in cn.iteritems()}) \
     for cn in cs])
Run Code Online (Sandbox Code Playgroud)

那么方差字典是

{k: p[k] - m[k]**2 for k in m}
Run Code Online (Sandbox Code Playgroud)