131 votes

convertir la valeur nan à zéro

J'ai un tableau numpy 2D. Certaines des valeurs de ce tableau sont NaN . Je souhaite effectuer certaines opérations à l'aide de ce tableau. Par exemple, considérons le tableau :

[[   0.   43.   67.    0.   38.]
 [ 100.   86.   96.  100.   94.]
 [  76.   79.   83.   89.   56.]
 [  88.   NaN   67.   89.   81.]
 [  94.   79.   67.   89.   69.]
 [  88.   79.   58.   72.   63.]
 [  76.   79.   71.   67.   56.]
 [  71.   71.   NaN   56.  100.]]

J'essaie de prendre chaque ligne, une à la fois, de la trier dans l'ordre inverse pour obtenir les 3 valeurs maximales de la ligne et de calculer leur moyenne. Le code que j'ai essayé est le suivant :

# nparr is a 2D numpy array
for entry in nparr:
    sortedentry = sorted(entry, reverse=True)
    highest_3_values = sortedentry[:3]
    avg_highest_3 = float(sum(highest_3_values)) / 3

Cela ne fonctionne pas pour les lignes contenant NaN . Ma question est la suivante : existe-t-il un moyen rapide de convertir tous les . NaN à zéro dans le tableau numpy 2D afin que je n'aie pas de problèmes avec le tri et les autres choses que j'essaie de faire.

4voto

Bilal Points 770

Vous pouvez utiliser numpy.nan_to_num :

numpy.nan_to_num(x) : Remplacer nan con zéro y inf con nombres finis .

Exemple (voir doc) :

>>> np.set_printoptions(precision=8)
>>> x = np.array([np.inf, -np.inf, np.nan, -128, 128])
>>> np.nan_to_num(x)
array([  1.79769313e+308,  -1.79769313e+308,   0.00000000e+000,
        -1.28000000e+002,   1.28000000e+002])

1voto

user3680588 Points 72

Nan n'est jamais égal à nan

if z!=z:z=0

donc pour un tableau 2D

for entry in nparr:
    if entry!=entry:entry=0

-1voto

Mohanad Kaleia Points 356

Vous pouvez utiliser la fonction lambda, par exemple pour un tableau 1D :

import numpy as np
a = [np.nan, 2, 3]
map(lambda v:0 if np.isnan(v) == True else v, a)

Vous obtiendrez ainsi le résultat :

[0, 2, 3]

-9voto

Senthil Kumaran Points 14934

Dans votre cas, si tous les éléments sont stockés en tant que str et il suffit d'utiliser trié comme vous le faites, puis de vérifier le premier élément et de le remplacer par "0".

>>> l1 = ['88','NaN','67','89','81']
>>> n = sorted(l1,reverse=True)
['NaN', '89', '88', '81', '67']
>>> import math
>>> if math.isnan(float(n[0])):
...     n[0] = '0'
... 
>>> n
['0', '89', '88', '81', '67']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X