【问题标题】:Pythonic way to calculate the mean and variance of values in CountersPythonic 方法来计算 Counters 中值的均值和方差
【发布时间】:2015-07-13 19:40:35
【问题描述】:

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

例如,我有四个 Counters 共享相同的键:

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])

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

【问题讨论】:

  • 什么版本的python?
  • @Padraic Cunningham 2.7 但无论 Python 版本如何,我都愿意接受任何建议 :)
  • 您可以使用 defaultdict 创建字典,这样会更简单,您想如何处理均值和方差?
  • 不用担心,FWIW 使用 >= python3.4 你也可以使用 statistics.mean 和 statistics.variance。你也可以使用for k, v in d.items():pastebin.com/HCTpYEuf
  • 你也可以将它映射到你所有的计数器上,用一个漂亮的衬里:map(lamdba v: np.mean(v.values()),[a,b,c,d]) 或同时作为一个元组列表进行这两个操作:map(lambda v: (np.mean(v.values()),np.var(v.values())),[a,b])

标签: python performance counter


【解决方案1】:

并不是我认为以下内容比您所拥有的更具可读性,而是它仅使用列表推导。

说你有

cs = (a, b, c, d)

然后可以找到均值字典

m = {k: float(d) / len(cs) for k, d in sum(cs).iteritems()}

对于方差,请注意,由definition of variance 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}

【讨论】:

  • 那么,仅使用列表推导式是否会使计算更快?
  • 列表推导通常比 for 循环快一点; YMMV,我怀疑它会在这里改变很多。我认为重点不同(请参阅here) - 更多 Pythonic 考虑使用循环来处理产生副作用的东西,并尽可能使用列表理解构建数据结构。一些人认为这种区别清除了代码。这不仅是一个个案问题,还有个人品味的空间。
猜你喜欢
  • 2012-04-17
  • 2016-01-10
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多