Comment puis-je vérifier pour des valeurs NaN?
float('nan')
résultats Nan (pas un nombre). Mais comment puis-je vérifier? Devrait être très facile, mais je ne la trouve pas.
- Pour certains, l'histoire de NaN en Python, voir PEP 754. python.org/dev/peps/pep-0754
numpy.isnan(numpy.nan)
sera ensuite de retour àTrue
. Et évidemment,import numpy
avant de faire cela. 🙂
Vous devez vous connecter pour publier un commentaire.
les mathématiques.isnan()
float("nan")
comme il le fait avecnumpy.core.numeric.NaN
, tout en comparant les deux avecis
ne fonctionne pas. Donc, cela pourrait être la solution préférable à (ancien?) code contenant éventuellement les deux définitions, si je ne me trompe pas?math.isnan
préférénp.isnan()
?import numpy
prend environ 15 MO de RAM, alors queimport math
prend un peu de 0,2 MOisdigit
n'est pas un chèque pour les nombres. Par exemple,'1.0'.isdigit()
produitFalse
.numpy.isnan
est un meilleur choix, puisqu'elle gère les tableaux NumPy. Si vous n'êtes pas à l'aide de NumPy, il n'y a aucun avantage à prendre un NumPy dépendance de dépenses et le temps de charge NumPy juste pour un NaN de vérifier (mais si vous êtes en train de rédiger le genre de code qui fait NaN vérifications, il est probable que vous doit utiliser NumPy).float('nan') == float('nan')
retourneFalse
— ce qui est étrange, une convention, mais fondamentalement partie de la définition d'un NaN. L'approche que vous voulez est en fait celui posté par Chris le Bouffon-Jeunes, ci-dessous.La façon habituelle de test pour un NaN est pour voir si il est égal à lui-même:
numpy.isnan(number)
vous dit si c'estNaN
ou pas dans Python 2.5.numpy.all(numpy.isnan(data_list))
est également utile si vous avez besoin pour déterminer si tous les éléments de la liste sont nanall(map(math.isnan, [float("nan")]*5))
math
.numpy.isnan
peut gérer des tableaux tout enmath.isnan
jette:TypeError: only size-1 arrays can be converted to Python scalars
.En fait je viens de tomber sur cela, mais pour moi, c'était de vérifier pour nan-inf ou inf. J'ai juste utilisé
Cela est vrai pour les nombres, false pour nan et à la fois inf, et déclenche une exception pour des choses comme des cordes ou d'autres types (qui est probablement une bonne chose). Aussi il n'est pas nécessaire de l'importation des bibliothèques comme les maths ou numpy (numpy est tellement grosse qu'elle a du double de la taille d'une application compilée).
math.isfinite
n'étais pas introduit jusqu'à ce que Python 3.2, si compte tenu de la réponse de @DaveTheScientist a été publié en 2012, ce n'était pas exactement "réinventer[ing] la roue" - solution tient toujours pour ceux qui travaillent avec Python 2.ici est une réponse de travailler avec:
float('nan')
np.nan
Ici, il est:
Et quelques exemples:
De sortie:
les mathématiques.isnan()
ou de comparer le nombre à lui-même. NaN est toujours != NaN, dans le cas contraire (par exemple si il est un certain nombre), la comparaison devrait réussir.
Une autre méthode si vous êtes coincé sur <2.6, vous n'avez pas de numpy, et vous n'avez pas la norme IEEE 754 support:
Bien je suis entré dans ce post, parce que j'ai eu quelques problèmes avec la fonction:
Il y a problème lorsque vous exécutez ce code:
Il soulève une exception.
Ma solution pour cela est de faire une autre vérification:
def is_nan(x): try: return math.isnan(x) except: return False
Ici sont les trois façons où vous pouvez tester une variable est "NaN" ou pas.
Sortie
Avec python < 2.6 j'ai fini avec
Cela fonctionne pour moi avec python 2.5.1 sur un Solaris 5.9 boîte et avec python 2.6.5 sur Ubuntu 10
-1.#IND
Je suis la réception de données à partir d'un web-service qui envoie
NaN
comme une chaîne de caractères'Nan'
. Mais il pourrait y avoir d'autres sortes de la chaîne dans mes données, ainsi, un simplefloat(value)
pourrait lancer une exception. J'ai utilisé la variante suivante de la accepté de répondre:Exigence:
try: int(value)
value
êtreNaN
ou pas?NaN
est (comme en python ce que vous pourriez obtenir à partir defloat('inf') * 0
), et ainsi, bien que la chaîne de caractères "Bonjour" n'est pas un nombre, mais il n'est pasNaN
parce queNaN
est toujours une valeur numérique!Toutes les méthodes de dire si la variable est NaN ou Aucun:
Aucun type
NaN type
Comment faire pour supprimer NaN (float) élément(s) à partir d'une liste des types de données mélangés
Si vous avez des types mélangés dans un objet iterable, voici une solution qui n'utilise pas de numpy:
Court-circuit d'évaluation signifie que
isnan
ne sera pas appelé sur des valeurs qui ne sont pas de type 'float' comme (False and …
rapidement évalue àFalse
sans avoir à évaluer la droite.pour cordes en panda prendre pd.isnull:
la fonction d'extraction de caractéristiques pour NLTK