La suppression des valeurs nan à partir d'un tableau
Je veux trouver comment l'enlever nan valeurs de mon tableau. Mon tableau ressemble à quelque chose comme ceci:
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
Comment puis-je supprimer le nan
valeurs de x
?
- Pour être clair, par "supprimer NaNs" tu veux dire filtrer seulement le sous-ensemble de valeurs non null. Pas de "remplir les NaNs avec une certaine valeur (zéro, constant, moyenne, médiane, etc.)"
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez numpy pour vos tableaux, vous pouvez également utiliser
De manière équivalente
[Merci à chbrown pour l'ajout d'abréviation]
Explication
L'intérieur de la fonction,
numpy.isnan
retourne un booléen/ensemble logique qui a de la valeurTrue
partout quex
n'est pas un nombre. Comme nous voulons que le contraire, nous utilisons la logique de ne pas l'opérateur,~
pour obtenir un tableau avecTrue
s partout quex
est un nombre valide.Enfin nous utilisons cette logique de tableau d'index dans le tableau d'origine
x
, de récupérer uniquement la non-valeurs NaN.x = x[numpy.isfinite(x)]
x = x[~numpy.isnan(x)]
, ce qui est équivalent à mutzmatron d'origine de la réponse, mais plus court. Dans le cas où vous voulez garder votre infinis autour de, savoir quenumpy.isfinite(numpy.inf) == False
, bien sûr, mais~numpy.isnan(numpy.inf) == True
.numpy
. @chbrown - merci pour le raccourci pourlogical_not
, mais méfiez-vous qu'il est beaucoup plus lent - stackoverflow.com/questions/15998188/..., stackoverflow.com/questions/13600988/...python -m timeit -s "import numpy; bools = numpy.random.uniform(size=10000) >= 0.5" "numpy.logical_not(bools)"
vspython -m timeit -s "import numpy; bools = numpy.random.uniform(size=10000) >= 0.5" "~bools"
(numpy.__version__ == '1.8.0'
)numpy.invert
etnumpy.logical_not
et a obtenu le même résultat pour les deux comme pour~
, sur numpy v1.7.1. Vous ne savez pas si l'architecture affecte la comparaison de la performance - suis en train de tester sur mon chromebook (armv7l).np.where(np.isfinite(x), x, 0)
x
n'est pas un tableau numpy. Si vous souhaitez utiliser la logique d'indexation, il doit être un tableau - par exemplex = np.array(x)
fonctionne à la fois pour les listes et les tableau numpy
puisque v!=v uniquement pour NaN
Essayez ceci:
Pour en savoir plus, lire sur Interprétations De La Liste.
print ([value for value in x if not math.isnan(value)])
np
paquet: Alors, retourne votre liste sans les nans:[value for value in x if not np.isnan(value)]
Pour moi la réponse par @jmetz ne fonctionne pas, cependant, l'utilisation des pandas isnull() n'.
Faire ci-dessus :
ou
J'ai trouvé que la réinitialisation de la même variable (x) ne pas enlever les réelles valeurs nan et a dû utiliser une variable différente. Définissant une variable différente supprimé les nans.
par exemple,
x
avec la nouvelle valeur (c'est à dire sans les NaNs...). Pouvez-vous donner plus d'info pour lesquelles cela pourrait se produire?Comme indiqué par d'autres
œuvres. Mais il va jeter erreur si la numpy dtype n'est pas un type de données natif, par exemple si elle est l'objet. Dans ce cas, vous pouvez utiliser les pandas.
Si vous utilisez
numpy
La accepté de répondre à change de forme pour la 2d tableaux.
Je vous présente une solution ici, en utilisant les Pandas dropna() fonctionnalité.
Il fonctionne pour les codes 1D et 2D tableaux. Dans le 2D cas, vous pouvez choisir météo à chute de la ligne ou de la colonne contenant
np.nan
.Résultat:
C'est mon approche du filtre ndarray "X" pour NaNs et infs,
J'ai créer une carte de lignes sans
NaN
et toutinf
comme suit:idx est un n-uplet. C'est la deuxième colonne (
idx[1]
) contient les indices de la matrice, où aucun NaN ni inf où le trouver à travers la ligne.Alors:
filtered_X
contient X sansNaN
niinf
.La manière la plus simple est:
Documentation: https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
s avec un grand nombre, alors que l'OP a demandé de retirer entièrement les éléments.