web-dev-qa-db-fra.com

convertir la valeur en nanomètre à zéro

J'ai un tableau 2D numpy. Certaines des valeurs de ce tableau sont NaN. Je veux effectuer certaines opérations en utilisant 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 par une, de la trier dans l'ordre inverse pour obtenir 3 valeurs maximum de la ligne et de prendre leur moyenne. Le code que j'ai essayé est:

# 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 toutes les valeurs de NaN en zéro dans le tableau numpy 2D afin que je n’aie aucun problème de tri ni d’autres tâches que j’essaie de faire?.

61
Curious2learn

Cela devrait fonctionner:

from numpy import *

a = array([[1, 2, 3], [0, 3, NaN]])
where_are_NaNs = isnan(a)
a[where_are_NaNs] = 0

Dans le cas ci-dessus, where_are_NaNs est:

In [12]: where_are_NaNs
Out[12]: 
array([[False, False, False],
       [False, False,  True]], dtype=bool)
94
Marcin

A est votre tableau 2D:

import numpy as np
A[np.isnan(A)] = 0

La fonction isnan produit un tableau bool indiquant où sont les valeurs NaN. Un tableau booléen peut être utilisé pour indexer un tableau de même forme. Pensez-y comme un masque.

104
Paul

Que diriez-vous de nan_to_num () ?

27
Drake Guan

Un exemple de code pour réponse de drake à utiliser nan_to_num :

>>> import numpy as np
>>> A = np.array([[1, 2, 3], [0, 3, np.NaN]])
>>> A = np.nan_to_num(A)
>>> A
array([[ 1.,  2.,  3.],
       [ 0.,  3.,  0.]])
9
serv-inc

Vous pouvez utiliser np.where pour trouver où vous avez NaN:

import numpy as np

a = np.array([[   0,   43,   67,    0,   38],
              [ 100,   86,   96,  100,   94],
              [  76,   79,   83,   89,   56],
              [  88,   np.nan,   67,   89,   81],
              [  94,   79,   67,   89,   69],
              [  88,   79,   58,   72,   63],
              [  76,   79,   71,   67,   56],
              [  71,   71,   np.nan,   56,  100]])

b = np.where(np.isnan(a), 0, a)

In [20]: b
Out[20]: 
array([[   0.,   43.,   67.,    0.,   38.],
       [ 100.,   86.,   96.,  100.,   94.],
       [  76.,   79.,   83.,   89.,   56.],
       [  88.,    0.,   67.,   89.,   81.],
       [  94.,   79.,   67.,   89.,   69.],
       [  88.,   79.,   58.,   72.,   63.],
       [  76.,   79.,   71.,   67.,   56.],
       [  71.,   71.,    0.,   56.,  100.]])
5
Anton Protopopov

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
1
litepresence

Vous pouvez utiliser la fonction lambda, un 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)

Cela vous donnera le résultat:

[0, 2, 3]
0
Mohanad Kaleia

Vous pouvez utiliser numpy.nan_to_num :

numpy.nan_to_num (x): remplacer nan par zéro et inf avec 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])
0
Bilal