计算计数器中值的均值和方差的Pythonic方法
我想知道是否有一种python方法来计算计数器的均值和方差 例如,我有四个计数器共享相同的键:计算计数器中值的均值和方差的Pythonic方法,python,performance,counter,Python,Performance,Counter,我想知道是否有一种python方法来计算计数器的均值和方差 例如,我有四个计数器共享相同的键: 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}) 我的方法是: each_key_val = {} for i in a.keys(): # The assumption he
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})
我的方法是:
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]]
我可以使用以下代码查找每个键的平均值/方差:
np.mean(each_key_val[i])
np.var(each_key_val[i])
与我的方法相比,有没有更简单的方法来计算每个关键点的均值/方差 我不认为下面的内容比你的更可读,但它只使用列表理解 说你有
cs = (a, b, c, d)
然后就可以找到一本中庸词典了
m = {k: float(d) / len(cs) for k, d in sum(cs).iteritems()}
对于方差,请注意,通过V[X]=E[x2]-(E[X])2,如果定义:
p = sum([Counter({k: ((float(d**2) / len(cs))) for (k, d) in cn.iteritems()}) \
for cn in cs])
那么方差字典就是
{k: p[k] - m[k]**2 for k in m}
python的哪个版本?@Padraic Cunningham
2.7
但是我愿意接受任何建议,不管python的版本是什么:)您可以使用更简单的defaultdict创建dict,您想如何处理均值和方差?不用担心,FWIW使用>=python3.4还可以使用statistics.mean和statistics.variance。您还可以对d.items()中的k,v使用:
您还可以使用一个漂亮的一行代码将其映射到所有计数器上:映射(lamdba v:np.mean(v.values()),[a,b,c,d])
或同时将这两个操作作为元组列表:映射(lambda v:(np.mean(v.values()),np.var(v.values()),[a,b])
那么,仅使用列表理解是否会加快计算速度?列表理解通常比循环快一点;YMMV,我怀疑它在这里会有多大变化。我认为这一点是不同的(请参阅)-一些更具python风格的人认为,对有副作用的东西使用循环,并尽可能使用列表理解来构建数据结构。有些人认为这种区分可以清除代码。这不仅是一个个案问题,还有个人品味的空间。