HOWTO · NumPy
NaN-Werte aus einem NumPy-Array entfernen
So entfernen Sie NaN-Werte aus einem NumPy-Array in Python
Auf dieser Seite
Um NaN-Elemente aus einem NumPy-Array zu entfernen, erstellen Sie eine Maske, die für alle Werte außer NaN True enthält, und verwenden diese Maske zur Auswahl der Elemente. Für ein NumPy-Array ist array[~np.isnan(array)] die Kurzform.
NaN-Werte mit den Funktionen logical_not() und isnan() in NumPy entfernen
np.isnan(array) gibt ein boolesches Array zurück, das dort True enthält, wo ein Element NaN ist. np.logical_not() kehrt diese Werte um, sodass die resultierende Maske für gewöhnliche Zahlen True enthält. Die boolesche Indizierung behält die passenden Elemente in ihrer ursprünglichen Reihenfolge bei. Der Operator ~ ist die kürzere Entsprechung für dieses NumPy-boolsche Array.
Das folgende Beispiel zeigt beide Formen sowie das Verhalten, wenn die Eingabe ausschließlich NaN-Werte oder gar keine NaN-Werte enthält:
import numpy as np
values = np.array([1.0, np.nan, 3.0])
without_nan = values[np.logical_not(np.isnan(values))]
without_nan_short = values[~np.isnan(values)]
all_nan = np.array([np.nan, np.nan])
no_nan = np.array([1, 2, 3])
print(without_nan)
print(without_nan_short)
print(all_nan[~np.isnan(all_nan)])
print(no_nan[~np.isnan(no_nan)])
[1. 3.]
[1. 3.]
[]
[1 2 3]
Beide Masken liefern dieselben gefilterten Werte. Bei einer Eingabe, die nur NaN-Werte enthält, entsteht ein leeres Array; eine Eingabe ohne NaN-Werte bleibt unverändert. Weitere Informationen finden Sie in der offiziellen Dokumentation zu np.logical_not() und zu np.isnan().
NaN-Werte mit der Funktion isfinite() in NumPy entfernen
np.isfinite(array) erstellt eine Maske, die für endliche Zahlen True enthält. Die Indizierung mit dieser Maske entfernt NaN-Werte, aber auch positive und negative Unendlichkeit. Verwenden Sie diese Funktion, wenn Sie ausschließlich endliche Werte behalten möchten. Soll dagegen nur nach NaN gefiltert werden und sollen Unendlichkeiten erhalten bleiben, verwenden Sie die oben gezeigte invertierte np.isnan()-Maske. Einzelheiten zum Verhalten bei numerischen Datentypen finden Sie in der offiziellen Dokumentation zu np.isfinite().
NaN-Werte mit math.isnan() entfernen
Die Standardbibliotheksfunktion math.isnan() prüft jeweils einen einzelnen Skalarwert. Importieren Sie sie zunächst mit import math. Für ein eindimensionales numerisches Array können Sie mit einer List Comprehension eine boolesche Maske erstellen: keep = [not math.isnan(value) for value in values]; anschließend wählen Sie mit filtered = values[keep] die Elemente aus. Bei diesem Ansatz wird jedes Array-Element in Python durchlaufen, während die NumPy-Funktionen direkt auf dem Array arbeiten. Er ist für eindimensionale Eingaben gedacht: Beim Durchlaufen eines mehrdimensionalen Arrays erhält man Teilarrays statt einzelner Zahlen.
NaN-Werte mit pandas.isnull() entfernen
Wenn pandas bereits Teil Ihres Projekts ist, importieren Sie es mit import pandas as pd. pd.isnull() erkennt fehlende Werte und kann die invertierte Maske bereitstellen: filtered = values[~pd.isnull(values)]. Dies ist eine pandas-Funktion und keine NumPy-Methode. Sie müssen pandas also nicht eigens für diese Aufgabe installieren. Die Erkennung fehlender Werte umfasst außerdem weitere pandas-Fehlwertmarkierungen, sofern sie in unterstützten Datenstrukturen vorkommen. Weitere Informationen finden Sie in der vorhandenen Referenz zu pandas isnull().