Como remover todas as linhas em um numpy.ndarray que contêm valores não numéricos

100

Basicamente, estou fazendo algumas análises de dados. Eu li em um conjunto de dados como numpy.ndarray e alguns dos valores estão faltando (por simplesmente não estar lá, ser NaNou ser uma string escrita " NA").

Quero limpar todas as linhas que contêm qualquer entrada como esta. Como faço isso com um ndarray entorpecido?

zebra
fonte

Respostas:

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

e reatribuir para a.

Explicação: np.isnan(a)retorna uma matriz semelhante com Trueonde NaN, em Falseoutro lugar. .any(axis=1)reduz um m*narray a numa oroperação lógica em todas as linhas, ~inverte True/Falsee a[ ]escolhe apenas as linhas do array original, que estão Trueentre colchetes.

eumiro
fonte
11
np.isfinitetambém é útil neste caso, bem como quando você deseja se livrar de ±Infvalores. Não requer o ~, uma vez que retorna verdadeiro apenas para reais finitos.
naught101
7
@ naught101 Você também precisa mudar anypara all. Já que você deseja selecionar linhas onde "todas são finitas", em vez de selecionar linhas onde "nenhuma é nan".
AnnanFay