web-dev-qa-db-fra.com

Quelle pourrait être la cause de la 'valeur invalide rencontrée dans less_equal' dans numpy

J'ai vécu un RuntimeWarning 

 RuntimeWarning: invalid value encountered in less_equal

Généré par cette ligne de code:

center_dists[j] <= center_dists[i]

center_dists[j] et center_dists[i] sont tous deux des tableaux numpy

Quelle pourrait être la cause de cet avertissement?

20
Alex Gao

Cela se produit probablement à cause d'un np.nan quelque part dans les entrées impliquées. Un exemple est présenté ci-dessous -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A<=B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: array([False,  True, False], dtype=bool)

Pour toutes les comparaisons impliquant np.nan, le résultat serait False. Confirmons-le pour une comparaison broadcasted . Voici un échantillon -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A[:,None] <= B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: 
array([[False, False, False],
       [ True,  True, False],
       [ True,  True, False]], dtype=bool)

Veuillez noter la troisième colonne de la sortie correspondant à la comparaison impliquant le troisième élément np.nan dans B et qui donne toutes les valeurs False.

22
Divakar

Pour faire suite à la réponse de Divakar et à son commentaire sur la suppression de la variable RuntimeWarning, une méthode plus sûre consiste à les supprimer uniquement localement à l'aide de with np.errstate() ( docs ): il est généralement bon d'être alerté lors d'une comparaison avec np.nan return False, et ignorez l’avertissement uniquement lorsque c’est vraiment ce que vous souhaitez. Voici l'exemple de l'OP:

with np.errstate(invalid='ignore'):
  center_dists[j] <= center_dists[i]

En quittant le bloc with, le traitement des erreurs est réinitialisé.

Au lieu de invalid value encountered, on peut également ignorer toutes les erreurs en passant all='ignore'. Il est intéressant de noter que ceci est manquant dans la kwargs dans les documents pour np.errstate(), mais pas dans ceux pour np.seterr() . (Cela ressemble à un petit bogue dans la documentation np.errstate().)

0
Ulrich Stern