Wie kann ich NaN-Werte aus einem NumPy-Array entfernen?
[1, 2, NaN, 4, NaN, 8] [1, 2, 4, 8]
Wie kann ich NaN-Werte aus einem NumPy-Array entfernen?
[1, 2, NaN, 4, NaN, 8] [1, 2, 4, 8]
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.]
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.
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 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.