2015-07-13 10 views
5

Mi chiedo se esiste un modo Pythonic per calcolare le medie e le varianze dei contatori?Modo pitonico per calcolare la media e la varianza dei valori nei contatori

Per esempio, ho quattro contatori che condividono gli stessi tasti:

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

Il mio modo per farlo è:

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

ho potuto utilizzare il seguente codice per trovare la media/varianza per ogni chiave:

np.mean(each_key_val[i]) 
np.var(each_key_val[i]) 

C'è un modo più semplice per calcolare la media/varianza per ogni chiave rispetto alla mia strada?

+0

quale versione di Python? –

+0

@Padraic Cunningham '2.7' Ma sono disposto ad accettare qualsiasi suggerimento indipendentemente dalla versione di Python :) – datadatadata

+1

Puoi creare il dict usando un defaultdict che sarebbe molto più semplice, cosa vuoi fare con la media e la varianza ? –

risposta

3

Non è che io pensi che quanto segue sia più leggibile di quello che hai, ma utilizza solo le list comprehensions.

Diciamo che avete

cs = (a, b, c, d) 

Poi un dizionario della media può essere trovato con

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

per la varianza, si noti che, dal definition of varianceV [X] = E [x ] - (E [X]), quindi, se si definisce:

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

poi il dizionario varianza è

{k: p[k] - m[k]**2 for k in m} 
+0

Quindi usare solo le list comprehensions rende il calcolo più veloce? – datadatadata

+1

La comprensione delle liste di solito è un po 'più veloce di quella dei loop; YMMV, e dubito che cambierà molto qui. Penso che il punto sia diverso (vedi [qui] (http://stackoverflow.com/questions/2849645/in-python-is-it-better-to-use-list-comprehensions-or-for-each-loops)) - è considerato da alcuni più Pythonic l'uso di loop per cose che producono effetti collaterali e per costruire strutture di dati, nella misura del possibile, usando la list comprehension. Alcuni ritengono che questa distinzione chiarisca il codice. Non solo si tratta di una domanda per caso, ma c'è anche spazio per i gusti personali. –