stackoverflow.com/questions/944700 mówi, jak sprawdzić NaN. W przypadku Inf i -Inf można testować za pomocą ==, ale to nie działa dla NaN z powodu reguł IEEE754 dla NaN.
David Heffernan,
Myślę, że najbardziej niezawodnym sposobem jest użycie odpowiednich funkcji, takich jak isinfi isnanzgodnie z zapewnieniem numpy. Zobacz moją odpowiedź poniżej.
To nauczy mnie, żebym nie wskoczył z żartem przed przeczytaniem pytania po raz drugi !! Przepraszam! To powiedziawszy, nie zaszkodzi powiedzieć tak samo, ponieważ łatwo wpaść w pułapkę, NaN! = NaN
David Heffernan
2
zauważ także: >>> 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
W Pythonie> = 2.6 możesz po prostu użyć math.isnan()imath.isinf()
Agos
8
numpyjest dość ciężkim importem, jeśli wszystko czego chcesz to NaNlubinf
cz
1
Jeśli wszystko, czego potrzebujesz, to NaNlub Inf, mógłbyś from numpy import nan, infistnieć od czasu postawienia tego pytania.
andrewgu
37
Czy można ustawić liczbę NaN lub nieskończoność?
Tak, w rzeczywistości istnieje kilka sposobów. Kilka działa bez żadnego importu, inne wymagają import, jednak dla tej odpowiedzi ograniczę biblioteki w przeglądzie do biblioteki standardowej i NumPy (która nie jest biblioteką standardową, ale bardzo popularną biblioteką innej firmy).
W poniższej tabeli podsumowano sposoby tworzenia nieskończonej liczby lub dodatniej lub ujemnej nieskończoności float:
czy jest jakaś funkcja sprawdzająca, czy liczba jest nieskończonością?
Tak, istnieje - w rzeczywistości istnieje kilka funkcji NaN, Infinity i ani Nan, ani Inf. Jednak te predefiniowane funkcje nie są wbudowane, zawsze wymagają import:
Funkcje cmathi numpydziałają również dla złożonych obiektów, sprawdzą, czy częścią rzeczywistą lub urojoną jest NaN lub Infinity.
Funkcje numpydziałają również dla numpytablic i wszystkiego, co można przekonwertować na jedną (np. Listy, krotki itp.)
Istnieją również funkcje, które jawnie sprawdzają dodatnią i ujemną nieskończoność w NumPy: numpy.isposinfi numpy.isneginf.
Panda oferuje dwie dodatkowe funkcje do sprawdzania NaN: pandas.isnai pandas.isnull(ale nie tylko NaN, to także pasuje Nonei NaT)
Mimo że nie ma żadnych wbudowanych funkcji, łatwo byłoby je utworzyć samodzielnie (pominąłem tutaj sprawdzanie typu i dokumentację):
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))
Podsumowując oczekiwane wyniki dla tych funkcji (zakładając, że dane wejściowe są zmiennoprzecinkowe):
Jednak jeśli chcesz dołączyć go do array(na przykład array.arraylub numpy.array), typ tablicy musi być floatlub, complexponieważ w przeciwnym razie spróbuje sprowadzić ją do typu tablic!
Uwaga: math.isnannie działa z liczbami zespolonymi. Użyj math.isnan(x.real) or math.isnan(x.imag)zamiast tego.
Jonathan H
2
Korzystając z Python 2.4, spróbuj
inf = float("9e999")
nan = inf - inf
Mam do czynienia z tym problemem, gdy przenosiłem simplejson na urządzenie osadzone, na którym działa Python 2.4, float("9e999")to naprawiło. Nie używaj inf = 9e999, musisz przekonwertować go z ciągu.
-infdaje -Infinity.
isinf
iisnan
zgodnie z zapewnieniemnumpy
. Zobacz moją odpowiedź poniżej.Odpowiedzi:
Rzuć z ciągu za pomocą
float()
:źródło
Tak, możesz
numpy
do tego użyć .źródło
math.isnan()
imath.isinf()
numpy
jest dość ciężkim importem, jeśli wszystko czego chcesz toNaN
lubinf
NaN
lubInf
, mógłbyśfrom numpy import nan, inf
istnieć od czasu postawienia tego pytania.Tak, w rzeczywistości istnieje kilka sposobów. Kilka działa bez żadnego importu, inne wymagają
import
, jednak dla tej odpowiedzi ograniczę biblioteki w przeglądzie do biblioteki standardowej i NumPy (która nie jest biblioteką standardową, ale bardzo popularną biblioteką innej firmy).W poniższej tabeli podsumowano sposoby tworzenia nieskończonej liczby lub dodatniej lub ujemnej nieskończoności
float
:Kilka uwag do stołu:
float
Konstruktor jest rzeczywiście wielkość liter, więc można również użyćfloat("NaN")
albofloat("InFiNiTy")
.cmath
Inumpy
stałe powrotu zwykły Pythonfloat
obiektów.numpy.NINF
właściwie jedyna stała, o której wiem, że nie wymaga-
.Możliwe jest tworzenie złożonych NaN i Infinity za pomocą
complex
icmath
:Opcje z ¹ zwracają zwykły
float
, a nie acomplex
.Tak, istnieje - w rzeczywistości istnieje kilka funkcji NaN, Infinity i ani Nan, ani Inf. Jednak te predefiniowane funkcje nie są wbudowane, zawsze wymagają
import
:Ponownie kilka uwag:
cmath
inumpy
działają również dla złożonych obiektów, sprawdzą, czy częścią rzeczywistą lub urojoną jest NaN lub Infinity.numpy
działają również dlanumpy
tablic i wszystkiego, co można przekonwertować na jedną (np. Listy, krotki itp.)numpy.isposinf
inumpy.isneginf
.NaN
:pandas.isna
ipandas.isnull
(ale nie tylko NaN, to także pasujeNone
iNaT
)Mimo że nie ma żadnych wbudowanych funkcji, łatwo byłoby je utworzyć samodzielnie (pominąłem tutaj sprawdzanie typu i dokumentację):
Podsumowując oczekiwane wyniki dla tych funkcji (zakładając, że dane wejściowe są zmiennoprzecinkowe):
Na liście nie ma problemu, zawsze możesz tam dołączyć NaN (lub Infinity):
Jednak jeśli chcesz dołączyć go do
array
(na przykładarray.array
lubnumpy.array
), typ tablicy musi byćfloat
lub,complex
ponieważ w przeciwnym razie spróbuje sprowadzić ją do typu tablic!źródło
math.isnan
nie działa z liczbami zespolonymi. Użyjmath.isnan(x.real) or math.isnan(x.imag)
zamiast tego.Korzystając z Python 2.4, spróbuj
Mam do czynienia z tym problemem, gdy przenosiłem simplejson na urządzenie osadzone, na którym działa Python 2.4,
float("9e999")
to naprawiło. Nie używajinf = 9e999
, musisz przekonwertować go z ciągu.-inf
daje-Infinity
.źródło