Comment puis-je obtenir tous les index de tous les NaN d'une liste?
J'essaye de faire une liste avec l'index de tous NaNs
dans la liste a
.
Le problème est que la liste ind
ne 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
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.isnan
donne un tableau de booléens indiquant quels éléments de a
sont NaN. numpy.where
donne 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 a
est 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 != x
une 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.nan
test, 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.nan
chèques, et ils vont vous mordre.