1
votes

Convertit nan en zéro lorsque numpy dtype est "object"

J'ai un tableau numpy qui contient nan. J'ai essayé de convertir ces nans en zéros en utilisant

X_= X_.astype(np.float64)

mais cela n'a pas fonctionné. Je soupçonne que c'est parce que le type de X_ est un objet. J'ai essayé de convertir cela en float64 en utilisant

 X_ = np.nan_to_num(X_, copy = False)

mais cela n'a pas fonctionné non plus

Existe-t-il un moyen de convertir nan en zéro lorsque dtype est object ?


12 commentaires

quel est votre type et dtype X_ ?


@Alpha dtype est un 'objet' et le type est un 'numpy.ndarray'


comment obtenez-vous cet «objet» nan?


@Alpha J'ai fait correspondre les mots d'une liste avec des clés d'un dictionnaire contenant des paires clé-valeur, puis chargé les valeurs correspondantes dans une liste et converti la liste en tableau. le dtype du tableau est devenu «objet» et les instances où un mot et une clé ne correspondaient pas, j'ai rempli un tableau zéro mais à la place, quand j'inspecte, j'ai vu nan. vector_values.append (self._E.get (w, Q) où w est la clé du dictionnaire et Q est un tableau numpy zéro.


d'après vos commentaires, je pense que quelque chose ne va pas. peut-être devriez-vous poser directement votre question: pourquoi votre zéro attendu devient nan


@Alpha Ok merci. Je l'ai fait ici [link] ( stackoverflow.com/questions/57851237/... )


Ne dites pas simplement "cela n'a pas fonctionné"; montrer l'erreur. OK, le premier peut générer une erreur, mais ne pas faire de changement. Mais qu'en est-il du second? Pourquoi ne pouvait-il pas être converti en flotteur? Quel élément l'a empêché.


@hpaulj le second a soulevé une ValueError: définition d'un élément de tableau avec une séquence qui pointait vers cette ligne de code particulière. Je n'ai pas été en mesure d'interpréter ce que cela signifie exactement.


Vous devrez examiner le tableau X_ en détail. séquence signifie quelque chose avec plusieurs éléments, comme une liste ou un tableau. Apparemment, votre tableau n'est pas un simple tableau de nombres, 0 et np.nan .


@hpaulj oui, il contient plusieurs tableaux. X_ est censé être un tableau (3663, 200) avec chaque élément contenant un vecteur 1 * 200. Serait-ce le problème et comment puis-je le résoudre?


Je suis confus. Voulez-vous dire un tableau numérique (3663 200) ou un tableau d'objets (3663 200) contenant des tableaux. Quelle est la forme réelle? (3663,)? Si c'est 1d avec l'objet dtype, alors les éléments sont probablement un mélange de tableaux de formes différentes, ou de tableaux et d'objets non-tableau. Je ne pense pas que vous puissiez résoudre ce problème après coup - vous devez bien faire la construction initiale.


continuons cette discussion dans le chat .


4 Réponses :


0
votes
[nan]
[0.]

0 commentaires

0
votes

Il semble qu'en raison du type d'objet, une conversion en float ne fonctionne pas. Peut-être un peu piraté, mais vous pouvez essayer de convertir en str:

X_.astype(str).replace('np.NaN', 0).astype(float)


5 commentaires

je l'ai fait avec ceci: X_ = X_.astype (str) .replace ('nan', np.zeros ((1, 200))). astype (float) et cela donne ValueError: définition d'un élément de tableau avec une séquence


Ce que j'ai essayé de faire est de remplacer chaque élément np.nan par un 0. Vous essayez de remplacer chaque élément np.nan par un tableau complet ( np.zeros ((1, 200)) ). C'est pourquoi ça ne marche pas. Utilisez simplement le remplacement par 0.


Malheureusement, je ne peux pas remplacer par un seul 0, car tous les tableaux doivent avoir la même forme et les autres entrées sont déjà (1 200). Y a-t-il un autre travail que je peux explorer?


Vous êtes censé remplacer chacun des 200 éléments par un 0 (si np.nan). Vous essayez de remplacer chaque élément par un vecteur de 200 éléments chacun (ce qui en fait une matrice de 200x200).


X_ contient 3663 lignes et 200 colonnes, certaines des lignes ne sont que nan, c'est pourquoi je veux remplacer chaque nan par un tableau (1, 200). Dans mon cas, nan n'est pas un élément, c'est un tableau complet. De plus, j'ai la même erreur quand est utilisé un seul zéro à la lecture d'un tableau zéro



0
votes

Si votre tableau ne contient que des éléments "raisonnables" (voir ci-dessous), vous pouvez utiliser la solution de contournement suivante:

np.where(X_==X_,X_,0)

Par raisonnable, je veux dire qu'un élément e satisfait e == e avec la seule exception de nan. Cela devrait par exemple être le cas si aucune classe définie par l'utilisateur n'est utilisée comme élément.


2 commentaires

d'après ce que j'ai compris, np.where est utilisé lorsque vous voulez trouver l'emplacement d'entrées particulières dans un tableau, ce que je n'essaye pas de faire. Mon titre a peut-être été un peu déroutant, mais je veux convertir tous les nan en un tableau numpy.zero.


@Kosi Lisez la documentation .



0
votes

Le dtype "objet" me posait également un problème. Mais votre astype (np.float64) a fonctionné pour moi. Merci!

Creating a numpy array from a mixed type DataFrame can create an 'object' numpy array dtype:
A: [ 1.  2.  3. nan] float64
B: [[1.0 2.0 3.0 nan]
 [1.0 2.0 3.0 '4']] object 

Converting vanilla A is fine:
 [  1.   2.   3. -99.] 

But not B:
 [[1.0 2.0 3.0 nan]
 [1.0 2.0 3.0 '4']] 

Not even this slice of B, 
B[0, :] :  [1.0 2.0 3.0 nan]
[1.0 2.0 3.0 nan] 

The astype(np.float64) does the trick here:
 [  1.   2.   3. -99.]

Résultat:

print("Creating a numpy array from a mixed type DataFrame can create an 'object' numpy array dtype:")
A = np.array([1., 2., 3., np.nan]); print('A:', A, A.dtype)
B = pd.DataFrame([[1., 2., 3., np.nan,],  [1, 2, 3, '4']]
                  ).to_numpy();  print('B:', B, B.dtype, '\n')

print('Converting vanilla A is fine:\n', np.nan_to_num(A, nan=-99), '\n')
print('But not B:\n', np.nan_to_num(B, nan=-99), '\n')
print('Not even this slice of B, \nB[0, :] : ', B[0, :])
print(np.nan_to_num(B[0, :], nan=-99), '\n')

print('The astype(np.float64) does the trick here:\n', 
      np.nan_to_num(B[0, :].astype(np.float64), nan=-99), '\n\n')


0 commentaires