2009-06-07 4 views
22

würde Ich mag den Mittelwert eines Arrays in Python in dieser Form berechnen:Wie benutze ich in Python numpy mit 'None'?

Matrice = [1, 2, None] 

Ich habe gerade meinen None Wert wie die numpy.mean Berechnung ignoriert haben, aber ich kann nicht herausfinden, wie man TU es.

+2

+1: Diese Frage kann für Arrays besonders relevant sein, die aus einer Datenbank importiert werden, in denen Werte manchmal NULL sein kann. – EOL

Antwort

10

Sie suchen zu ignorieren für masked arrays. Hier ist ein Beispiel.

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

Leider maskierte Arrays werden nicht gründlich in numpy unterstützt, so dass Sie haben um zu schauen, um zu sehen, was kann und nicht mit ihnen fertig werden.

+2

ein Mitglied Funktion, die sehr geholfen hat, war "gefüllt". das brachte das maskierte Array zurück zu einem normalen Array, gefüllt mit einem Wert, den ich als ungültig erkennen würde (NaN, -9999, was auch immer Ihre Benutzer brauchen). – mariotomo

+0

Leistung von maskierten Arrays ist auch deutlich weniger als normale numpy Arrays als die Implementierung ist reine Python. Wenn Sie mit Big Data zu tun haben, achten Sie auf die Auswirkungen auf die Leistung. – timbo

3

nicht numpy, aber in Standard-Python verwendet man None auszufiltern Listenkomprehensionen oder die Filterfunktion verwenden, können

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

und im Durchschnitt dann das Ergebnis der None

+4

'x! = None' wird normalerweise geschrieben' x ist nicht None' (PEP 8: "Vergleiche zu Singletons wie None sollten immer mit 'is' oder 'is not' gemacht werden, niemals mit den Gleichheitsoperatoren.") – EOL

3

Sie können auch mit Werten wie NaN oder Inf kludgen.

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

Eigentlich könnte es nicht einmal ein Klotz sein. Wikipedia says:

NaNs können verwendet werden, um fehlende Werte in Berechnungen darzustellen.

Eigentlich funktioniert dies nicht für die mean() -Funktion, obwohl, so vergiss es. :)

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

Eigentlich funktioniert 'mean (a [~ isnan (a)]) 'explizit alle Nicht-NaN-Werte zu verwenden. – u0b34a0f6ae

+1

@kaizer Ihr Kommentar ist ein Juwel. großartige Lösung, danke! – Agos

1

Sie können auch Filter verwenden, übergeben Keine ihm, wird es nicht wahr Objekte filtern, auch 0,: D Also, es verwenden, wenn Sie benötigen 0 nicht.

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

Sie scipy dafür verwenden können:

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

Danke, das ist genau das, was ich brauchte! – max

+1

Dies funktioniert nicht. 'a = [1,2, None]' und dann 'st.nanmean (a)' führt zu einem TypeError. – Nate

+1

Ja, Sie haben Recht, es funktioniert auf numpy.nan, nicht auf Keine. Es ist am nützlichsten, wenn Sie den Mittelwert für den numpy Vektor berechnen. –