2009-06-07 7 views
22

Mi piacerebbe calcolare la media di un array in Python in questa forma:Come usare numpy con il valore 'None' in Python?

Matrice = [1, 2, None] 

Vorrei solo avere il mio valore None ignorato dal calcolo numpy.mean ma non riesco a capire come fallo.

+2

+1: questa domanda può essere particolarmente rilevante per le matrici che vengono importati da un database, in cui i valori a volte può essere NULL. – EOL

risposta

10

Siete alla ricerca per masked arrays. Ecco un esempio.

import MA 
a = MA.array([1, 2, None], mask = [0, 0, 1]) 
print "average =", MA.average(a) 

Purtroppo, gli array mascherati non sono completamente supportate in NumPy, quindi hai avuto modo di guardarsi intorno per vedere che cosa può e non può essere fatto con loro.

+2

un membro la funzione che ha aiutato molto è stata "riempita". che ha riportato l'array mascherato a un array normale, riempito con un valore che avrei riconosciuto non valido (NaN, -9999, qualunque sia l'esigenza degli utenti). – mariotomo

+0

Anche le prestazioni degli array mascherati sono significativamente inferiori rispetto agli array di numpy regolari poiché l'implementazione è in puro Python. Se hai a che fare con i big data, fai attenzione alle implicazioni sul rendimento. – timbo

3

non hanno usato NumPy, ma in Python standard potete filtrare None usando list comprehensions o la funzione di filtro

>>> [i for i in [1, 2, None] if i != None] 
[1, 2] 
>>> filter(lambda x: x != None, [1, 2, None]) 
[1, 2] 

e quindi la media il risultato di ignorare il None

+4

'x! = None' viene in genere scritto' x non è None' (PEP 8: "I confronti con singleton come None dovrebbero sempre essere eseguiti con 'is' o 'is not', mai gli operatori di uguaglianza.") – EOL

3

Potrebbe anche essere possibile eseguire il kludge con valori come NaN o Inf.

In [1]: array([1, 2, None]) 
Out[1]: array([1, 2, None], dtype=object) 

In [2]: array([1, 2, NaN]) 
Out[2]: array([ 1., 2., NaN]) 

In realtà, potrebbe non essere nemmeno un kludge. Wikipedia says:

I NaN possono essere utilizzati per rappresentare i valori mancanti nei calcoli.

In realtà, questo non funziona tuttavia per la funzione mean(), quindi non importa. :)

In [20]: mean([1, 2, NaN]) 
Out[20]: nan 
+6

In realtà, 'mean (a [~ isnan (a)])' sceglie esplicitamente tutti i valori non NaN. – u0b34a0f6ae

+1

@kaizer il tuo commento è un gioiello. ottima soluzione, grazie! – Agos

1

È inoltre possibile utilizzare il filtro, passare Nessuno per esso, sarà filtrare gli oggetti non veri, anche 0,: D Così, usarlo quando non avete bisogno 0 troppo.

>>> filter(None,[1, 2, None]) 
[1, 2] 
6

È possibile utilizzare SciPy per questo:

import scipy.stats.stats as st 
m=st.nanmean(vec) 
+0

Grazie, questo è proprio quello di cui avevo bisogno! – max

+1

Questo non funziona. 'a = [1,2, None]' e quindi 'st.nanmean (a)' produce un errore TypeError. – Nate

+1

Sì, hai ragione, funziona su numpy.nan, non su Nessuno. È molto utile quando si calcola la media sul vettore numpy. –

Problemi correlati