2013-02-13 9 views
6

Ich habe eine Liste von Zahlen, die ich in einem Array numpy setzen:numpy: Operator - Arrays, die keinen

>>> import numpy as np 
>>> v=np.array([10.0, 11.0]) 

dann möchte ich von jedem Wert in dem Array eine Anzahl subtrahieren. Es kann wie folgt mit numpy Arrays durchgeführt werden:

>>> print v - 1.0 
[ 9. 10.] 

Leider meine Daten enthält oft fehlende Werte, vertreten durch None. Für diese Art von Daten bekomme ich diesen Fehler:

>>> v=np.array([10.0, 11.0, None]) 
>>> print v - 1.0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float' 

Was würde Ich mag für das obige Beispiel bekommen ist:

[ 9. 10. None] 

Wie kann ich es auf eine einfache und effiziente Art und Weise erreichen?

Antwort

8

Meine Empfehlung ist es, entweder die Verwendung maskiert Arrays:

v = np.ma.array([10., 11, 0],mask=[0, 0, 1]) 
print v - 10 
>>> [0.0 1.0 --] 

oder NaNs

v = np.array([10.,11,np.nan]) 
print v - 10 
>>> [ 0. 1. nan] 

ich eigentlich lieber NaNs als Daten Indikatoren fehlen.

+3

Diese Optionen sind auch viel besser als die Verwendung von None in diesem OP-Array ist eigentlich vom Typ "Objekt" und daher sehr ineffizient, Raster als ein Float-Array. – Dougal

+0

Vielen Dank, klingt 'numpy.nan' klingt wie der Weg zu gehen, praktischer als maskierte Arrays. Wann wären die maskierten Arrays besser als die Anzeige fehlender Daten als numpy.nan? – piokuc

+0

Ich denke, maskierte Arrays könnte besser für einige Operationen wie Sagen Summen und Durchschnitt von Arrays sein (dann werden die fehlenden Daten richtig behandelt). Außerdem, ich denke, Sie können tatsächliche NaNs von fehlenden Daten unterscheiden. Ansonsten (würde ich immer sagen) sind NANs besser IMO. –