373 Stimmen

Wie kann ich NaN-Werte aus einem NumPy-Array entfernen?

Wie kann ich NaN-Werte aus einem NumPy-Array entfernen?

[1, 2, NaN, 4, NaN, 8]      [1, 2, 4, 8]

9voto

koliyat9811 Punkte 759

Wie von anderen gezeigt

x[~numpy.isnan(x)]

funktioniert. Es wird jedoch ein Fehler ausgegeben, wenn der Numpy-DType kein nativer Datentyp ist, z. B. wenn es sich um ein Objekt handelt. In diesem Fall können Sie pandas verwenden.

x[~pandas.isna(x)] or x[~pandas.isnull(x)]

8voto

aloha Punkte 4044

Wenn Sie Folgendes verwenden numpy

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]

7voto

Markus Dutschke Punkte 6917

Les akzeptierte Antwort ändert die Form für 2d-Arrays. Ich präsentiere hier eine Lösung, die die Pandas dropna() Funktionalität. Sie funktioniert für 1D- und 2D-Arrays. Im 2D-Fall können Sie wählen, ob Sie die Zeile oder Spalte löschen mit np.nan .

import pandas as pd
import numpy as np

def dropna(arr, *args, **kwarg):
    assert isinstance(arr, np.ndarray)
    dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
    if arr.ndim==1:
        dropped=dropped.flatten()
    return dropped

x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )

print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')

print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')

print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')

Ergebnis:

==================== 1D Case: ====================
Input:
[1400. 1500. 1600.   nan   nan   nan 1700.]

dropna:
[1400. 1500. 1600. 1700.]

==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna (rows):
[[1400. 1500. 1600.]]

dropna (columns):
[[1500.]
 [   0.]
 [1800.]]

==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna:
[1400. 1500. 1600. 1700.]

7voto

Robin Teuwens Punkte 81

Für den Fall, dass es hilft, für einfache 1d-Arrays:

x = np.array([np.nan, 1, 2, 3, 4])

x[~np.isnan(x)]
>>> array([1., 2., 3., 4.])

aber wenn Sie auf Matrizen erweitern und die Form beibehalten wollen:

x = np.array([
    [np.nan, np.nan],
    [np.nan, 0],
    [1, 2],
    [3, 4]
])

x[~np.isnan(x).any(axis=1)]
>>> array([[1., 2.],
           [3., 4.]])

Ich bin auf dieses Problem gestoßen, als ich mit Pandas zu tun hatte .shift() Funktionalität, und ich wollte die Verwendung von .apply(..., axis=1) aufgrund ihrer Ineffizienz um jeden Preis.

6voto

melissaOu Punkte 61

Durchführung der oben genannten Maßnahmen:

x = x[~numpy.isnan(x)]

ou

x = x[numpy.logical_not(numpy.isnan(x))]

Ich stellte fest, dass das Zurücksetzen auf dieselbe Variable (x) die tatsächlichen Nan-Werte nicht entfernte und ich eine andere Variable verwenden musste. Das Setzen auf eine andere Variable entfernte die Nan-Werte. z.B..

y = x[~numpy.isnan(x)]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X