Ist es möglich, eine Zahl auf NaN oder unendlich zu setzen?
202
Ist es möglich, ein Element eines Arrays NaNin Python festzulegen?
Ist es zusätzlich möglich, eine Variable auf +/- unendlich zu setzen? Wenn ja, gibt es eine Funktion, mit der überprüft werden kann, ob eine Zahl unendlich ist oder nicht?
Ich denke, dass der zuverlässigste Weg darin besteht, die richtigen Funktionen wie isinfund isnanwie von zu verwenden numpy. Siehe meine Antwort unten.
Das wird mich lehren, nicht mit einem Scherz einzuspringen, bevor ich die Frage ein zweites Mal lese !! Es tut uns leid! Das heißt, es würde nicht schaden, es trotzdem zu sagen, denn es ist eine einfache Falle, in die man fallen kann, NaN! = NaN
David Heffernan
2
Beachten Sie auch: >>> float ('Inf') - float ('Inf') ===> nan
import numpy as np
a = arange(3,dtype=float)
a[0]= np.nan
a[1]= np.inf
a[2]=-np.inf
a # is now [nan,inf,-inf]
np.isnan(a[0])# True
np.isinf(a[1])# True
np.isinf(a[2])# True
Auf Python> = 2.6 können Sie einfach math.isnan()undmath.isinf()
Agos
8
numpyist ein ziemlich schwerer Import, wenn alles, was Sie wollen, NaNoderinf
cz
1
Wenn alles, was Sie brauchen, NaNoder ist Inf, könnte es eine geben, from numpy import nan, infdie existiert hat, seit diese Frage aufgeworfen wurde.
Andrewgu
37
Ist es möglich, eine Zahl auf NaN oder unendlich zu setzen?
Ja, tatsächlich gibt es mehrere Möglichkeiten. Einige funktionieren ohne Import, während andere dies erfordern import. Für diese Antwort beschränke ich die Bibliotheken in der Übersicht jedoch auf Standardbibliothek und NumPy (keine Standardbibliothek, sondern eine sehr verbreitete Bibliothek von Drittanbietern).
Die folgende Tabelle fasst zusammen, wie man eine Nicht-Zahl oder eine positive oder negative Unendlichkeit erzeugen kann float:
Die Optionen mit ¹ geben eine Ebene zurück float, nicht a complex.
Gibt es eine Funktion, um zu überprüfen, ob eine Zahl unendlich ist oder nicht?
Ja, tatsächlich gibt es mehrere Funktionen für NaN, Infinity und weder Nan noch Inf. Diese vordefinierten Funktionen sind jedoch nicht integriert. Sie erfordern immer Folgendes import:
Die Funktionen cmathund numpyfunktionieren auch für komplexe Objekte. Sie prüfen, ob der Real- oder Imaginärteil NaN oder Infinity ist.
Die numpyFunktionen funktionieren auch für numpyArrays und alles, was in eines konvertiert werden kann (wie Listen, Tupel usw.).
Es gibt auch Funktionen, die in NumPy explizit nach positiver und negativer Unendlichkeit suchen: numpy.isposinfund numpy.isneginf.
Pandas bietet zwei zusätzliche Funktionen, nach denen gesucht werden muss NaN: pandas.isnaund pandas.isnull(aber nicht nur NaN, es stimmt auch mit Noneund NaT)
Obwohl es keine eingebauten Funktionen gibt, wäre es einfach, sie selbst zu erstellen (ich habe hier die Typprüfung und Dokumentation vernachlässigt):
def isnan(value):return value != value # NaN is not equal to anything, not even itself
infinity = float("infinity")def isinf(value):return abs(value)== infinity
def isfinite(value):returnnot(isnan(value)or isinf(value))
Um die erwarteten Ergebnisse für diese Funktionen zusammenzufassen (vorausgesetzt, die Eingabe ist ein Float):
Wenn Sie es jedoch in ein array(zum Beispiel array.arrayoder numpy.array) aufnehmen möchten, muss der Typ des Arrays sein floatoder complexweil es sonst versucht, es auf den Array-Typ herunterzuspielen!
Hinweis: Funktioniert math.isnannicht mit komplexen Zahlen. Verwenden Sie math.isnan(x.real) or math.isnan(x.imag)stattdessen.
Jonathan H
2
Versuchen Sie es mit Python 2.4
inf = float("9e999")
nan = inf - inf
Ich habe das Problem, als ich den simplejson auf ein eingebettetes Gerät portierte, auf dem Python 2.4 ausgeführt wurde, und das Problem float("9e999")behoben wurde. Nicht verwenden inf = 9e999, Sie müssen es aus einem String konvertieren.
-infgibt die -Infinity.
isinf
undisnan
wie von zu verwendennumpy
. Siehe meine Antwort unten.Antworten:
Cast aus String mit
float()
:quelle
Ja, das können Sie verwenden
numpy
.quelle
math.isnan()
undmath.isinf()
numpy
ist ein ziemlich schwerer Import, wenn alles, was Sie wollen,NaN
oderinf
NaN
oder istInf
, könnte es eine geben,from numpy import nan, inf
die existiert hat, seit diese Frage aufgeworfen wurde.Ja, tatsächlich gibt es mehrere Möglichkeiten. Einige funktionieren ohne Import, während andere dies erfordern
import
. Für diese Antwort beschränke ich die Bibliotheken in der Übersicht jedoch auf Standardbibliothek und NumPy (keine Standardbibliothek, sondern eine sehr verbreitete Bibliothek von Drittanbietern).Die folgende Tabelle fasst zusammen, wie man eine Nicht-Zahl oder eine positive oder negative Unendlichkeit erzeugen kann
float
:Ein paar Bemerkungen zur Tabelle:
float
Konstruktor unterscheidet nicht zwischen Groß- und Kleinschreibung, sodass Sie auchfloat("NaN")
oder verwenden könnenfloat("InFiNiTy")
.cmath
undnumpy
geben einfache Python-float
Objekte zurück.numpy.NINF
ist eigentlich die einzige Konstante, von der ich weiß, dass sie das nicht erfordert-
.Es ist möglich, komplexes NaN und Unendlichkeit mit
complex
und zu erzeugencmath
:Die Optionen mit ¹ geben eine Ebene zurück
float
, nicht acomplex
.Ja, tatsächlich gibt es mehrere Funktionen für NaN, Infinity und weder Nan noch Inf. Diese vordefinierten Funktionen sind jedoch nicht integriert. Sie erfordern immer Folgendes
import
:Nochmals ein paar Bemerkungen:
cmath
undnumpy
funktionieren auch für komplexe Objekte. Sie prüfen, ob der Real- oder Imaginärteil NaN oder Infinity ist.numpy
Funktionen funktionieren auch fürnumpy
Arrays und alles, was in eines konvertiert werden kann (wie Listen, Tupel usw.).numpy.isposinf
undnumpy.isneginf
.NaN
:pandas.isna
undpandas.isnull
(aber nicht nur NaN, es stimmt auch mitNone
undNaT
)Obwohl es keine eingebauten Funktionen gibt, wäre es einfach, sie selbst zu erstellen (ich habe hier die Typprüfung und Dokumentation vernachlässigt):
Um die erwarteten Ergebnisse für diese Funktionen zusammenzufassen (vorausgesetzt, die Eingabe ist ein Float):
In einer Liste ist es kein Problem, Sie können dort immer NaN (oder Infinity) einfügen:
Wenn Sie es jedoch in ein
array
(zum Beispielarray.array
odernumpy.array
) aufnehmen möchten, muss der Typ des Arrays seinfloat
odercomplex
weil es sonst versucht, es auf den Array-Typ herunterzuspielen!quelle
math.isnan
nicht mit komplexen Zahlen. Verwenden Siemath.isnan(x.real) or math.isnan(x.imag)
stattdessen.Versuchen Sie es mit Python 2.4
Ich habe das Problem, als ich den simplejson auf ein eingebettetes Gerät portierte, auf dem Python 2.4 ausgeführt wurde, und das Problem
float("9e999")
behoben wurde. Nicht verwendeninf = 9e999
, Sie müssen es aus einem String konvertieren.-inf
gibt die-Infinity
.quelle