web-dev-qa-db-fra.com

Ignorer l'avertissement de division par 0 dans NumPy

J'ai une fonction pour les problèmes statistiques:

import numpy as np
from scipy.special import gamma as Gamma

def Foo(xdata):
    ...
    return x1 * (
                 ( #R is a numpy vector
                  ( ((R - x2)/beta) ** (x3 -1) ) * 
                  ( np.exp( - ((R - x2) / x4) ) ) /
                  ( x4 * Gamma(x3))
                 ).real
                )

Parfois, je reçois du Shell l'avertissement suivant:

RuntimeWarning: divide by zero encountered in...

J'utilise la fonction numpy isinf pour corriger les résultats de la fonction dans d'autres fichiers, donc je n'ai pas besoin de cet avertissement.

Existe-t-il un moyen d'ignorer le message? En d'autres termes, je ne veux pas que le Shell imprime ce message.

Je ne veux pas désactiver tous les avertissements python, juste celui-ci.

28
overcomer

Vous pouvez désactiver l'avertissement avec numpy.seterr . Mettez ceci avant la division possible par zéro:

np.seterr(divide='ignore')

Cela désactivera les avertissements de division zéro à l'échelle mondiale. Si vous souhaitez simplement les désactiver un peu, vous pouvez utiliser numpy.errstate dans une clause with:

with np.errstate(divide='ignore'):
    # some code here

Pour une division zéro par zéro (indéterminée, donne un NaN), le comportement d'erreur a changé avec numpy version 1.12.0: ceci est maintenant considéré comme "invalide", alors qu'il était auparavant "diviser".

Ainsi, s'il y a une chance que votre numérateur soit également nul, utilisez

np.seterr(divide='ignore', invalid='ignore')

ou

with np.errstate(divide='ignore', invalid='ignore'):
    # some code here

Voir la section "Compatibilité" dans les notes de version , dernier paragraphe avant la section "Nouvelles fonctionnalités":

La comparaison des nombres à virgule flottante NaN déclenche désormais un avertissement d'exécution non valide. Si un NaN est attendu, l'avertissement peut être ignoré à l'aide de np.errstate.

64
dddsnn

Vous pouvez également utiliser numpy.divide pour la division. De cette façon, vous n'avez pas à désactiver explicitement les avertissements.

In [725]: np.divide(2, 0)
Out[725]: 0
3
fixxxer