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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.