2015-07-13 2 views
5

Мне интересно, есть ли у Pythonic способ вычисления средств и отклонений счетчиков?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}) 

Мой способ сделать это:

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

Есть ли более простой способ вычислить среднее/дисперсию для каждого ключа по сравнению с моим путем?

+0

какая версия питона? –

+0

@Padraic Cunningham '2.7' Но я готов принять любые предложения, независимо от версии Python :) – datadatadata

+1

Вы можете создать dict с использованием defaultdict, который будет намного проще, что вы хотите делать со средним значением и дисперсией ? –

ответ

3

Это не то, что я думаю, что следующее более читаемо, чем то, что у вас есть, но оно использует только списки.

Скажем, у вас есть

cs = (a, b, c, d) 

Затем словарь среднем может быть найден с

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

для дисперсии, обратите внимание, что, по definition of varianceВ [х] = E [х ] - (E [X]), поэтому, если вы определяете:

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} 
+0

Значит, использование только списков позволяет быстрее вычислять вычисления? – datadatadata

+1

Перечисления списков обычно немного быстрее, чем для циклов; YMMV, и я сомневаюсь, что здесь многое изменится. Я думаю, что дело обстоит иначе (см. [Здесь] (http://stackoverflow.com/questions/2849645/in-python-is-it-better-to-use-list-comprehensions-or-for-each-loops)) - некоторые Pythonic считают, что используют циклы для вещей, которые производят побочные эффекты, и строят структуры данных, насколько это возможно, используя понимание списка. Некоторые считают, что это различие очищает код. Мало того, что это вопрос в каждом случае, есть также место для личного вкуса. –

Смежные вопросы