So entfernen Sie alle Zeilen in einer numpy.ndarray, die nicht numerische Werte enthalten

91

Grundsätzlich mache ich eine Datenanalyse. Ich habe einen Datensatz als numpy.ndarray eingelesen und einige der Werte fehlen (entweder weil ich einfach nicht da bin, weil ich da binNaN oder weil ich eine Zeichenfolge geschrieben habe " NA").

Ich möchte alle Zeilen löschen, die einen solchen Eintrag enthalten. Wie mache ich das mit einem numpy ndarray?

Zebra
quelle

Antworten:

159
>>> a = np.array([[1,2,3], [4,5,np.nan], [7,8,9]])
array([[  1.,   2.,   3.],
       [  4.,   5.,  nan],
       [  7.,   8.,   9.]])

>>> a[~np.isnan(a).any(axis=1)]
array([[ 1.,  2.,  3.],
       [ 7.,  8.,  9.]])

und ordnen Sie dies neu zu a.

Erläuterung: np.isnan(a)Gibt ein ähnliches Array mit Truewhere NaNan Falseanderer Stelle zurück. .any(axis=1)reduziert ein m*nArray auf nmit einer logischen orOperation für die gesamten Zeilen, ~invertiert True/Falseund a[ ]wählt nur die Zeilen aus dem ursprünglichen Array aus, die Truein den Klammern stehen.

Eumiro
quelle
10
np.isfiniteist auch in diesem Fall nützlich, wenn Sie ±InfWerte entfernen möchten . Es erfordert das nicht ~, da es nur für endliche Realzahlen true zurückgibt.
naught101
6
@ naught101 Sie müssen auch Änderungen anyan all. Da Sie Zeilen auswählen möchten, in denen "alle endlich sind", anstatt Zeilen auszuwählen, in denen "keine nan" sind.
AnnanFay