Jak usunąć wszystkie wiersze z numpy.ndarray, które zawierają wartości nienumeryczne

100

Zasadniczo przeprowadzam analizę danych. Czytam w zbiorze danych jako numpy.ndarray i brakuje niektórych wartości (albo po prostu nie będąc tam, będąc NaN, albo będąc ciągiem napisanym „ NA”).

Chcę wyczyścić wszystkie wiersze zawierające taki wpis. Jak mam to zrobić z numpy ndarray?

zebra
źródło

Odpowiedzi:

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

i przypisz to ponownie do a.

Objaśnienie: np.isnan(a)zwraca podobną tablicę z Truegdzie NaN, Falsegdzie indziej. .any(axis=1)redukuje m*ntablicę do nz logiczną oroperacją na całych wierszach, ~odwraca True/Falsei a[ ]wybiera tylko te wiersze z oryginalnej tablicy, które znajdują się Truew nawiasach.

eumiro
źródło
11
np.isfiniteprzydaje się również w tym przypadku, a także gdy chcesz pozbyć się ±Infwartości. Nie wymaga ~, ponieważ zwraca prawdę tylko dla skończonych liczb rzeczywistych.
naught101,
7
@ naught101 Musisz także zmienić anyna all. Ponieważ chcesz wybrać wiersze, w których „wszystkie są skończone”, zamiast wybierać wiersze, w których „żadne nie są nan”.
AnnanFay