Python >> Tutoriel Python >  >> Python Tag >> NumPy

[Résolu] NumPy RuntimeWarning :tranche All-NaN rencontrée

Formulation du problème

Vous utilisez le np.nanmedian() de NumPy fonction dans votre code qui est censée ignorer NaN valeurs lors du calcul de la moyenne d'un tableau NumPy.

import numpy as np
a = np.array([np.NaN, np.NaN])
mean = np.nanmedian(a)

Mais lors de son utilisation, NumPy lève un RuntimeWarning: All-NaN slice encountered messages :

Warning (from warnings module):
  File "C:\Users\xcent\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\nanfunctions.py", line 1114
    overwrite_input=overwrite_input)
RuntimeWarning: All-NaN slice encountered

Quelle est la raison de cet avertissement et comment y remédier ?

Solution + Explication

La raison pour laquelle cet avertissement se produit est que vous appliquez le np.nanmedian() fonction sur un tableau vide. La fonction ne provoque pas d'erreur si le tableau contient au moins une valeur non NaN :

>>> np.nanmedian([0.42, np.NaN, np.NaN])
0.42

Si au moins un élément est une valeur numérique, la moyenne est clairement définie :obtenez la médiane de tous les éléments non NaN éléments.

Cependant, si tous les éléments d'un tableau NumPy sont np.NaN , NumPy lève le RuntimeWarning :

import numpy as np
a = np.array([np.NaN, np.NaN])
mean = np.nanmedian(a)
print(mean)
'''
OUTPUT:
Warning (from warnings module):
  File "C:\Users\xcent\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\nanfunctions.py", line 1114
    overwrite_input=overwrite_input)
RuntimeWarning: All-NaN slice encountered
nan
'''

Pourtant, vous pouvez également voir qu'il génère toujours la valeur de retour :not-a-number ou nan .

Comme ce cas limite est correctement défini et sans ambiguïté, cela a amené certains programmeurs à se demander s'il était même logique d'émettre cet avertissement.

? À mon avis, émettre un avertissement n'a pas beaucoup de sens dans le cas du np.nanmedian() fonction. D'après Python's Zen of Python, nous savons que "explicite vaut mieux qu'implicite" . Donc, soit déclenchez une exception et laissez le programmeur la gérer directement, soit laissez-la simplement passer si tout est correctement défini.

Si, comme moi, vous êtes agacé par cet avertissement, vous pouvez simplement le supprimer :

Comment supprimer RuntimeWarning ?

Le gestionnaire de contexte warnings.catch_warnings supprime l'avertissement, mais seulement si vous anticipez effectivement son arrivée. Sinon, vous risquez de manquer quelques RuntimeWarning supplémentaires s vous n'avez pas vu venir.

import numpy as np
import warnings


with warnings.catch_warnings():
    warnings.simplefilter("ignore", category=RuntimeWarning)
    median = np.nanmedian([np.NaN, np.NaN])
    print(median)

La sortie est sans avertissement :

nan

Cependant, vous devez être sûr que c'est le seul avertissement qui peut apparaître dans le with environnement de bloc. Sinon, vous risquez de manquer certains avertissements importants, comme nous l'avons déjà mentionné.

Un moyen plus sûr serait probablement d'utiliser warnings.filterwarnings(action='ignore', message='All-NaN slice encountered') laisser passer non anticipé RuntimeWarning s.