Comment puis-je obtenir tous les index de tous les NaN d'une liste?


Image de balise Jaime Garcia Lozano

J'essaye de faire une liste avec l'index de tous NaNsdans la liste a.

Le problème est que la liste indne se remplit de rien. Cela fonctionne si au lieu de NaN, je mets une chaîne aléatoire comme c.

import numpy as np

a=[1, 2, 3, 4, np.nan, np.nan, 2, np.nan]

ind=[]
for i in range(0,len(a)):

    if a[i]==float("NaN"):
        ind.append(i)
print ind
user2357112 prend en charge Monica

Si vous utilisez NumPy, vous devriez vraiment commencer à utiliser des tableaux et sortir de l'habitude de boucler manuellement au niveau de Python. Les boucles manuelles sont généralement environ 100 fois plus lentes que de laisser NumPy gérer les choses, et les listes de flottants prennent environ 4 fois la mémoire d'un tableau.

Dans ce cas, NumPy peut vous donner un tableau d'indices NaN tout simplement:

ind = numpy.where(numpy.isnan(a))[0]

numpy.isnandonne un tableau de booléens indiquant quels éléments de asont NaN. numpy.wheredonne un tableau d'indices d' Trueéléments, mais enveloppé dans un tuple à 1 élément pour la cohérence avec le comportement sur les tableaux multidimensionnels, donc [0]extrait le tableau du tuple.

Cela fonctionne quand aest une liste, mais vous devriez vraiment utiliser des tableaux.


Votre tentative échoue car les valeurs NaN ne sont pas égales entre elles ou elles-mêmes:

>>> numpy.nan == numpy.nan
False
>>> numpy.nan == float('nan')
False

NaN a été conçu de cette façon pour des raisons de commodité algorithmique, pour effectuer x != xune vérification simple des valeurs NaN dans des environnements où la production d'un NaN à comparer est difficile, et parce que les NaN ont un composant de charge utile rarement utilisé qui peut être différent entre différents NaN.


L'autre réponse recommande un is numpy.nantest, mais celui-ci est bogué et peu fiable. Cela ne fonctionne que si vos NaN sont l'objet spécifique numpy.nan, ce qui est rarement le cas:

>>> float('nan') is numpy.nan
False
>>> numpy.float64(0)/0 is numpy.nan
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
False
>>> numpy.array([numpy.nan])[0] is numpy.nan
False

Se fondent sur les is numpy.nanchèques, et ils vont vous mordre.

Articles connexes