Ich muss eine Funktion schreiben, die erkennt, ob die Eingabe mindestens einen nicht numerischen Wert enthält. Wenn ein nicht numerischer Wert gefunden wird, wird ein Fehler ausgegeben (da die Berechnung nur einen numerischen Wert zurückgeben sollte). Die Anzahl der Dimensionen des Eingabearrays ist nicht im Voraus bekannt - die Funktion sollte unabhängig von ndim den richtigen Wert liefern. Als zusätzliche Komplikation könnte die Eingabe ein einzelner Float numpy.float64
oder sogar etwas Seltsames wie ein nulldimensionales Array sein.
Die naheliegende Möglichkeit, dies zu lösen, besteht darin, eine rekursive Funktion zu schreiben, die über jedes iterierbare Objekt im Array iteriert, bis ein Nicht-Iterabe gefunden wird. Die numpy.isnan()
Funktion wird auf jedes nicht iterierbare Objekt angewendet. Wenn mindestens ein nicht numerischer Wert gefunden wird, gibt die Funktion sofort False zurück. Andernfalls wird, wenn alle Werte in der Iterable numerisch sind, schließlich True zurückgegeben.
Das funktioniert gut, aber es ist ziemlich langsam und ich gehe davon aus, dass NumPy einen viel besseren Weg hat, dies zu tun. Was ist eine Alternative, die schneller und numpyischer ist?
Hier ist mein Modell:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
contains_nan
sieht verdächtig aus: "Gibt false zurück, wenn mindestens ein nicht numerischer Wert vorhanden ist". Ich hätte erwartetcontains_nan
zurückzukehren,True
wenn das Array NaN enthält.array(['None', 'None'], dtype=object)
? Sollte eine solche Eingabe nur eine Ausnahme auslösen?float('nan') in x
. Es funktioniert nicht.Antworten:
Dies sollte schneller als das Iterieren sein und funktioniert unabhängig von der Form.
Bearbeiten: 30x schneller:
Ergebnisse:
Bonus: Es funktioniert gut für NumPy-Typen ohne Array:
quelle
float('nan') in x
nicht nicht? Ich versuchte es und Python zurückkehrt ,False
wox = [1,2,3,float('nan')]
.numpy.any
eines Genexp nur den Genexp zurückgibt. Sie führen nicht die Berechnung durch, von der Sie glauben, dass Sie sie sind. Rufen Sie niemalsnumpy.any
einen Genexp an.np.isfinite
anstattnp.isnan
numerische Überläufe, Instabilität usw. zu erkennen.Wenn unendlich ein möglicher Wert ist, würde ich numpy.isfinite verwenden
Wenn das oben Gesagte zu ausgewertet wird
True
,myarray
enthält nonumpy.nan
,numpy.inf
oder-numpy.inf
Werte.numpy.nan
wird mitnumpy.inf
Werten in Ordnung sein , zum Beispiel:quelle
float('nan') in x
nicht nicht? Ich versuchte es und Python zurückkehrt ,False
wox = [1,2,3,float('nan')]
.nan
s nicht als gleich angesehen werden. Versuchen Sie esfloat('nan') == float('nan')
.Pfft! Mikrosekunden! Lösen Sie niemals ein Problem in Mikrosekunden, das in Nanosekunden gelöst werden kann.
Beachten Sie, dass die akzeptierte Antwort:
Eine bessere Lösung besteht darin, True sofort zurückzugeben, wenn NAN gefunden wird:
und arbeitet für n-Dimensionen:
Vergleichen Sie dies mit der numpy nativen Lösung:
Die Early-Exit-Methode ist eine Beschleunigung um 3 Größenordnungen oder Größenordnungen (in einigen Fällen). Nicht zu schäbig für eine einfache Anmerkung.
quelle
Mit numpy 1.3 oder svn können Sie dies tun
Die Behandlung von Nans in Vergleichen war in früheren Versionen nicht konsistent.
quelle
float('nan') in x
nicht nicht? Ich versuchte es und Python zurückkehrt ,False
wox = [1,2,3,float('nan')]
.float("nan")==float("nan")
gebenFalse
(obwohl machbar, sollte es wahrscheinlich NAN oder Keine zurückgeben). In ähnlicher Weise ist die Seltsamkeit mit NAN und Boolen NULL in vielen Sprachen wahr, einschließlich SQL (wobei NULL = NULL niemals wahr ist).(np.where(np.isnan(A)))[0].shape[0]
wird größer sein als0
wenn esA
mindestens ein Element enthältnan
,A
könnte einen x m
Matrix sein.Beispiel:
quelle