Ist es möglich, eine Zahl auf NaN oder unendlich zu setzen?

Lesezeit: 6 Minuten

Benutzer-Avatar
Bob

Ist es möglich, ein Element eines Arrays zu setzen NaN in Python?

Ist es außerdem möglich, eine Variable auf +/- unendlich zu setzen? Wenn ja, gibt es eine Funktion, um zu überprüfen, ob eine Zahl unendlich ist oder nicht?

  • stackoverflow.com/questions/944700 erklärt Ihnen, wie Sie nach NaN suchen. Für Inf und -Inf können Sie mit == testen, aber das funktioniert nicht für NaN wegen der IEEE754-Regeln für NaN.

    – David Heffernan

    25. März 2011 um 22:27 Uhr


Cast aus Schnur mit float():

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

  • Das wird mich lehren, nicht mit einem Scherz einzuspringen, bevor ich die Frage ein zweites Mal gelesen habe !! Es tut uns leid! Trotzdem würde es nicht schaden, dies zu sagen, denn es ist eine einfache Falle, in die man tappen kann, NaN != NaN

    – David Heffernan

    25. März 2011 um 22:30 Uhr


  • Beachten Sie auch: >>> float(‘Inf’)-float(‘Inf’) ===> nan

    – ntg

    2. September 2014 um 16:04 Uhr


  • Hinweis:float('Inf')*0 und float('Inf')/float('Inf') ==> nein. und auch float('Inf')*-1 ==> -inf

    – matan h

    10. Dezember 2020 um 13:44 Uhr


Ja, können Sie verwenden numpy dafür.

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 verwenden math.isnan() und math.isinf()

    – Agos

    9. Mai 2011 um 10:21 Uhr

  • numpy ist ein ziemlich schwerer Import, wenn Sie nur wollen NaN oder inf

    – cz

    3. April 2018 um 16:10 Uhr

  • Wenn alles, was Sie brauchen, ist NaN oder Infeiner könnte from numpy import nan, inf die existiert, seit diese Frage gestellt wurde.

    – andrewgu

    27. Februar 2019 um 0:01 Uhr

Benutzer-Avatar
MSeifert

Ist es möglich, eine Zahl auf NaN oder unendlich zu setzen?

Ja, tatsächlich gibt es mehrere Möglichkeiten. Einige funktionieren ohne Importe, während andere dies erfordern importaber für diese Antwort beschränke ich die Bibliotheken in der Übersicht auf Standardbibliothek und NumPy (was keine Standardbibliothek, sondern eine sehr verbreitete Bibliothek von Drittanbietern ist).

Die folgende Tabelle fasst die Möglichkeiten zusammen, wie man eine Nicht-Zahl oder eine positive oder negative Unendlichkeit erzeugen kann 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    │
╘══════════╧══════════════╧════════════════════╧════════════════════╛

Ein paar Anmerkungen zur Tabelle:

  • Das float Der Konstruktor unterscheidet tatsächlich nicht zwischen Groß- und Kleinschreibung, sodass Sie auch verwenden können float("NaN") oder float("InFiNiTy").
  • Das cmath und numpy Konstanten geben einfaches Python zurück float Objekte.
  • Das numpy.NINF ist eigentlich die einzige mir bekannte Konstante, die das nicht benötigt -.
  • Es ist möglich, komplexe NaN und Infinity mit zu erstellen complex und 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           │
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
    

    Die Optionen mit ¹ geben eine Ebene zurück floatkein complex.

Gibt es eine Funktion, um zu überprüfen, ob eine Zahl unendlich ist oder nicht?

Ja, das gibt es – 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 eine 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     │
╘══════════╧═════════════╧════════════════╧════════════════════╛

Nochmal ein paar Anmerkungen:

  • Das cmath und numpy Funktionen funktionieren auch für komplexe Objekte, sie prüfen, ob entweder der Real- oder der Imaginärteil NaN oder Infinity ist.
  • Das numpy Funktionen funktionieren auch für numpy Arrays und alles, was in eins konvertiert werden kann (wie Listen, Tupel usw.)
  • Es gibt auch Funktionen, die in NumPy explizit auf positive und negative Unendlichkeit prüfen: numpy.isposinf und numpy.isneginf.
  • Pandas bietet zwei zusätzliche Funktionen zur Überprüfung an NaN: pandas.isna und pandas.isnull (aber nicht nur NaN, es passt auch None und NaT)
  • Auch wenn es keine eingebauten Funktionen gibt, wäre es einfach, sie selbst zu erstellen (ich habe hier 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):
        return not (isnan(value) or isinf(value))
    

Um die erwarteten Ergebnisse für diese Funktionen zusammenzufassen (unter der Annahme, dass die Eingabe ein Float ist):

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

Ist es möglich, ein Element eines Arrays in Python auf NaN zu setzen?

In einer Liste ist es kein Problem, Sie können dort immer NaN (oder Infinity) einfügen:

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

Wenn Sie es jedoch in eine aufnehmen möchten array (zum Beispiel array.array oder numpy.array) dann den Typ des Arrays muss sein float oder complex weil es sonst versuchen wird, es auf den Arrays-Typ umzuwandeln!

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

  • Notiz: math.isnan funktioniert nicht mit komplexen Zahlen. Verwenden math.isnan(x.real) or math.isnan(x.imag) stattdessen.

    – Jonathan H

    5. April 2018 um 10:57 Uhr

Wenn Sie Python 2.4 verwenden, versuchen Sie es

inf = float("9e999")
nan = inf - inf

Ich stehe vor dem Problem, als ich den Simplejson auf ein eingebettetes Gerät portierte, auf dem Python 2.4 ausgeführt wird. float("9e999") behoben. Nicht verwenden inf = 9e999müssen Sie es aus einer Zeichenfolge konvertieren.
-inf gibt die -Infinity.

Oder Sie können sie berechnen

Python 3.9 on Windows 10
>>> import sys
>>> Inf = sys.float_info.max * 10
>>> Inf
inf
>>> NaN = Inf - Inf
>>> NaN
nan

1052750cookie-checkIst es möglich, eine Zahl auf NaN oder unendlich zu setzen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy