Remplacer les NaN dans le tableau NumPy avec la valeur non-NaN la plus proche
J'ai un tableau NumPy a
comme suit:
>>> str(a)
'[ nan nan nan 1.44955726 1.44628034 1.44409573\n 1.4408188 1.43657094 1.43171624 1.42649744 1.42200684 1.42117704\n 1.42040255 1.41922908 nan nan nan nan\n nan nan]'
Je veux remplacer chaque NaN le plus proche de la non-valeur NaN, de sorte que tous les NaN au début, se mettre à 1.449...
et l'ensemble de la NaN est à la fin préparez-vous à 1.419...
.
Je peux voir comment le faire pour des cas spécifiques, comme ça, mais j'ai besoin d'être en mesure de le faire en général, pour toute longueur de tableau, avec toute la longueur de NaN est au début et à la fin du tableau (il n'y aura pas NaN est au milieu de ces chiffres). Des idées?
Je peux trouver le NaN est assez facilement avec np.isnan()
mais je ne peux pas travailler sur la façon d'obtenir la valeur la plus proche à chaque NaN.
source d'informationauteur robintw | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
La suite va le faire:
C'est un droit
numpy
solution nécessitant pas de Python boucles, pas de récursivité, pas d'interprétations de la liste, etc.Une solution alternative (cela va interpoler linéairement pour les tableaux
NaN
s dans le milieu, en tant que bien):Cela donne:
NaN
s ont la propriété intéressante de comparer différents d'eux-mêmes, donc nous permettre de trouver rapidement l'index de la non-nan éléments:il est maintenant facile de remplacer les nans avec la valeur souhaitée:
Enfin, nous pouvons mettre cela dans une fonction:
modifier
Ouch, à venir à partir de C++ j'oublie toujours de liste des plages... @aix la solution est la façon la plus élégante et plus efficace que mon C++ish boucles, utiliser à la place de la mienne.
Une solution récursive!
Je suis tombé sur le problème et a dû trouver une solution personnalisée pour dispersées NaNs. La fonction ci-dessous remplace toute NaN par le premier numéro de l'occurrence vers la droite, si aucune n'existe, qu'il remplace par le premier numéro de l'apparition de la gauche. Autre manipulation qui peut être fait pour la remplacer par la moyenne de la limite d'occurrences.
Résultat est:
J'ai eu quelque chose comme cela
C'est un peu maladroit, mais étant donné qu'il est divisé en deux lignes avec imbriqué inline si dans l'un d'entre eux.