Czy można ustawić liczbę NaN lub nieskończoność?


202

Czy NaNw Pythonie można ustawić element tablicy ?

Dodatkowo, czy można ustawić zmienną na +/- nieskończoność? Jeśli tak, to czy jest jakaś funkcja sprawdzająca, czy liczba jest nieskończonością?


3
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.
— Olivier Verdier

Odpowiedzi:


271

Rzuć z ciągu za pomocą float():

>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False

1
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
— ntg

76

Tak, możesz numpydo tego użyć .

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

21
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:

╒══════════╤══════════════╤════════════════════╤════════════════════╕
│   result │ NaN          │ Infinity           │ -Infinity          │
│ module   │              │                    │                    │
╞══════════╪══════════════╪════════════════════╪════════════════════╡
│ built-in │ float("nan") │ float("inf")       │ -float("inf")      │
│          │              │ float("infinity")  │ -float("infinity") │
│          │              │ float("+inf")      │ float("-inf")      │
│          │              │ float("+infinity") │ float("-infinity") │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ math     │ math.nan     │ math.inf           │ -math.inf          │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ cmath    │ cmath.nan    │ cmath.inf          │ -cmath.inf         │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ numpy    │ numpy.nan    │ numpy.PINF         │ numpy.NINF         │
│          │ numpy.NaN    │ numpy.inf          │ -numpy.inf         │
│          │ numpy.NAN    │ numpy.infty        │ -numpy.infty       │
│          │              │ numpy.Inf          │ -numpy.Inf         │
│          │              │ numpy.Infinity     │ -numpy.Infinity    │
╘══════════╧══════════════╧════════════════════╧════════════════════╛

Kilka uwag do stołu:

  • floatKonstruktor jest rzeczywiście wielkość liter, więc można również użyć float("NaN")albo float("InFiNiTy").
  • cmathI numpystałe powrotu zwykły Python floatobiektów.
  • To numpy.NINFwłaściwie jedyna stała, o której wiem, że nie wymaga -.
  • Możliwe jest tworzenie złożonych NaN i Infinity za pomocą complexi cmath:

    ╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
    │   result │ NaN+0j         │ 0+NaNj          │ Inf+0j              │ 0+Infj               │
    │ module   │                │                 │                     │                      │
    ╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡
    │ built-in │ complex("nan") │ complex("nanj") │ complex("inf")      │ complex("infj")      │
    │          │                │                 │ complex("infinity") │ complex("infinityj") │
    ├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤
    │ cmath    │ cmath.nan ¹    │ cmath.nanj      │ cmath.inf ¹         │ cmath.infj           │
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛

    Opcje z ¹ zwracają zwykły float, a nie a complex.

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:

╒══════════╤═════════════╤════════════════╤════════════════════╕
│      for │ NaN         │ Infinity or    │ not NaN and        │
│          │             │ -Infinity      │ not Infinity and   │
│ module   │             │                │ not -Infinity      │
╞══════════╪═════════════╪════════════════╪════════════════════╡
│ math     │ math.isnan  │ math.isinf     │ math.isfinite      │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ cmath    │ cmath.isnan │ cmath.isinf    │ cmath.isfinite     │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ numpy    │ numpy.isnan │ numpy.isinf    │ numpy.isfinite     │
╘══════════╧═════════════╧════════════════╧════════════════════╛

Ponownie kilka uwag:

  • 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):
        return not (isnan(value) or isinf(value))

Podsumowując oczekiwane wyniki dla tych funkcji (zakładając, że dane wejściowe są zmiennoprzecinkowe):

╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
│          input │ NaN   │ Infinity   │ -Infinity   │ something else   │
│ function       │       │            │             │                  │
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
│ isnan          │ True  │ False      │ False       │ False            │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isinf          │ False │ True       │ True        │ False            │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isfinite       │ False │ False      │ False       │ True             │
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛

Czy w Pythonie można ustawić element tablicy na NaN?

Na liście nie ma problemu, zawsze możesz tam dołączyć NaN (lub Infinity):

>>> [math.nan, math.inf, -math.inf, 1]  # python list
[nan, inf, -inf, 1]

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!

>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan,  0.,  0.])

>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])

>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer

1
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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.