240 votes

Est-il possible de définir un nombre à NaN ou à l'infini ?

Est-il possible de donner à un élément d'un tableau la valeur suivante NaN en Python ?

En outre, est-il possible de définir une variable à +/- l'infini ? Si oui, existe-t-il une fonction permettant de vérifier si un nombre est infini ou non ?

4 votes

stackoverflow.com/questions/944700 vous indique comment vérifier les NaN. Pour Inf et -Inf, vous pouvez tester avec == mais cela ne fonctionne pas pour NaN à cause des règles IEEE754 pour NaN.

0 votes

Je pense que le moyen le plus fiable est d'utiliser des fonctions appropriées comme isinf y isnan conformément aux dispositions de la numpy . Voir ma réponse ci-dessous.

306voto

marcog Points 39356

Transférer une chaîne de caractères en utilisant float() :

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

1 votes

Cela m'apprendra à ne pas me lancer dans une boutade avant d'avoir lu la question une seconde fois ! Désolé ! Cela dit, ça ne fait pas de mal de le dire quand même parce que c'est un piège facile à tomber, NaN != NaN

2 votes

Notez aussi : >>> float('Inf')-float('Inf') ===> nan

0 votes

Note : float('Inf')*0 y float('Inf')/float('Inf') ==> nan. et aussi float('Inf')*-1 ==> -inf

83voto

Olivier Verdier Points 12332

Oui, vous pouvez utiliser numpy pour ça.

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

22 votes

Sur python >= 2.6, vous pouvez simplement utiliser math.isnan() y math.isinf()

12 votes

numpy est une importation assez lourde si tout ce que vous voulez est NaN o inf

2 votes

Si tout ce dont vous avez besoin est NaN o Inf on pourrait from numpy import nan, inf qui existe depuis que cette question a été soulevée.

54voto

MSeifert Points 6307

Est-il possible de définir un nombre à NaN ou à l'infini ?

Oui, en fait, il y a plusieurs façons de procéder. Quelques-unes fonctionnent sans aucune importation, tandis que d'autres requièrent import Cependant, pour cette réponse, je limiterai les bibliothèques dans l'aperçu à la bibliothèque standard et à NumPy (qui n'est pas une bibliothèque standard mais une bibliothèque tierce très courante).

Le tableau suivant résume les façons dont on peut créer un non-nombre ou un infini positif ou négatif. 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    

Quelques remarques à la table :

  • Le site float est en fait insensible à la casse, vous pouvez donc également utiliser float("NaN") o float("InFiNiTy") .
  • Le site cmath y numpy les constantes renvoient du Python pur float objets.
  • Le site numpy.NINF est en fait la seule constante que je connaisse qui ne nécessite pas l'option - .
  • Il est possible de créer des NaN et Infini complexes avec complex y 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           

    Les options avec ¹ retournent un simple float et non un complex .

existe-t-il une fonction permettant de vérifier si un nombre est infini ou non ?

Oui, il existe - en fait, il y a plusieurs fonctions pour NaN, Infini, et ni Nan ni Inf. Cependant, ces fonctions prédéfinies ne sont pas intégrées, elles nécessitent toujours une fonction 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     

Encore une fois, quelques remarques :

  • Le site cmath y numpy fonctionnent également pour les objets complexes, elles vérifient si la partie réelle ou imaginaire est NaN ou Infini.
  • Le site numpy fonctionnent également pour numpy les tableaux et tout ce qui peut être converti en un tableau (comme les listes, les tuple, etc.)
  • Il existe également des fonctions qui vérifient explicitement l'infini positif et négatif dans NumPy : numpy.isposinf y numpy.isneginf .
  • Pandas propose deux fonctions supplémentaires pour vérifier que NaN : pandas.isna y pandas.isnull (mais pas seulement NaN, il correspond aussi à None y NaT )
  • Même s'il n'y a pas de fonctions intégrées, il serait facile de les créer soi-même (j'ai négligé la vérification du type et la documentation ici) :

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

Pour résumer les résultats attendus pour ces fonctions (en supposant que l'entrée est un flottant) :

          input  NaN    Infinity    -Infinity    something else   
 function                                                         

 isnan           True   False       False        False            

 isinf           False  True        True         False            

 isfinite        False  False       False        True             

Est-il possible de donner la valeur NaN à un élément d'un tableau en Python ?

Dans une liste, ce n'est pas un problème, vous pouvez toujours y inclure NaN (ou Infini) :

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

Cependant, si vous voulez l'inclure dans un array (par exemple array.array o numpy.array ) alors le type du tableau doit être float o complex parce qu'autrement, il essaiera de le convertir en type de tableau !

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

Nota: math.isnan ne fonctionne pas avec les nombres complexes. Utilisez math.isnan(x.real) or math.isnan(x.imag) à la place.

2voto

Lorsque vous utilisez Python 2.4, essayez

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

Je suis confronté à un problème lorsque je portais le simplejson sur un appareil embarqué qui utilise Python 2.4, float("9e999") C'est réparé. N'utilisez pas inf = 9e999 vous devez le convertir à partir d'une chaîne de caractères. -inf donne le -Infinity .

0voto

Coder432 Points 1

Ou vous pouvez les calculer

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X