2017-05-31 2 views
1
x = np.empty([2], dtype=object) 
> array([None, None], dtype=object) 

x[0] = 'a' 
> array(['a', None], dtype=object) 

I [False, True] aus diesem Objekt ein boolean-Array zu erhalten bin versucht getippt ndarray wo der Objekttyp None ist.element Vergleich zu Nicht mit ndarray Objekt dtype

Dinge, die nicht funktionieren: , x.isfinite(), , np.isnan(x). Die Anordnung kann in n Dimensionen sein, was Schleifenschleifen zu einem unangenehmen Anblick macht.

+1

Als beiseite sollten Sie Ihr Bestes tun, um zu vermeiden w orking mit 'dtype = object' Arrays. Sie sind im Wesentlichen verkümmerte Python-Listen. Vielleicht können Sie eine Größe String dtype versuchen? –

+0

NumPy hat auch [MaskedArrays] (https://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html), sie sind möglicherweise nicht ganz einfach zu verstehen, zunächst. Aber besonders wenn Sie einige "ungültige" Einträge haben, sind diese viel schneller als Objekt-Arrays. – MSeifert

Antwort

6

In NumPy 1.12 und früher müssen Sie explizit numpy.equal aufrufen, um einen Broadcast Gleichheitsvergleich zu erhalten. Hinterlassen Sie einen Kommentar, so dass zukünftige Leser verstehen, warum Sie es tun:

# Comparisons to None with == don't broadcast (yet, as of NumPy 1.12). 
# We need to use numpy.equal explicitly. 
numpy.equal(x, None) 

In NumPy 1.13 und später x == None will give you a broadcasted equality comparison, aber man kann immer noch numpy.equal(x, None) verwenden, wenn Sie mit früheren Versionen der Abwärtskompatibilität möchten.

1

Einige Möglichkeiten, das zu tun ist -

x < 0 
x!='a' 

Array ([True, False], dtype = Bool)

+0

x <0 war eine Überraschung, nette Abkürzung. x! = "a" funktioniert natürlich nur für "a", aber gut, wenn das das Ziel ist. Vielen Dank! –

+3

Der '<0'-Ansatz funktioniert nur in Python-2.x. In Python 3 wird eine Ausnahme ausgelöst. Auch die Rückgabe scheint falsch zu sein - ich bekomme 'array ([False, True], dtype = bool)' für den 'x! = 'A''-Vergleich. – MSeifert

2

Sie wickeln können None in einem list oder array erzwingen Sie elementweise Vergleiche:

>>> x == [None] 
array([False, True], dtype=bool) 

>>> x == np.array([None]) 
array([False, True], dtype=bool) 
Verwandte Themen