Comment puis-je attraper un numpy avertissement comme c'est une exception (pas juste pour le test)?

Je dois faire un polynôme de Lagrange en Python pour un projet que je suis en train de faire. Je suis en train de faire un barycentriques le style d'éviter l'utilisation explicite d'une boucle for, par opposition à un Newton est divisé différence de style. Le problème que j'ai c'est que j'ai besoin d'attraper une division par zéro, mais en Python (ou peut-être numpy) il fait juste un avertissement au lieu d'une normale exception.

Donc, ce que j'ai besoin de savoir comment le faire est de prendre cet avertissement, comme si c'était une exception. Les questions liées à ce que j'ai trouvé sur ce site ont répondu à pas dans la façon dont j'avais besoin. Voici mon code:

import numpy as np
import matplotlib.pyplot as plt
import warnings

class Lagrange:
    def __init__(self, xPts, yPts):
        self.xPts = np.array(xPts)
        self.yPts = np.array(yPts)
        self.degree = len(xPts)-1 
        self.weights = np.array([np.product([x_j - x_i for x_j in xPts if x_j != x_i]) for x_i in xPts])

    def __call__(self, x):
        warnings.filterwarnings("error")
        try:
            bigNumerator = np.product(x - self.xPts)
            numerators = np.array([bigNumerator/(x - x_j) for x_j in self.xPts])
            return sum(numerators/self.weights*self.yPts) 
        except Exception, e: # Catch division by 0. Only possible in 'numerators' array
            return yPts[np.where(xPts == x)[0][0]]

L = Lagrange([-1,0,1],[1,0,1]) # Creates quadratic poly L(x) = x^2

L(1) # This should catch an error, then return 1. 

Lorsque ce code est exécuté, le résultat que j'obtiens est:

Warning: divide by zero encountered in int_scalars

C'est l'avertissement que j'ai envie de l'attraper. Il devrait se produire à l'intérieur de la compréhension de liste.

  • Êtes-vous bien sûr que c'est Warning: ...? Essayer des choses comme np.array([1])/0 - je obtenir RuntimeWarning: ... en sortie.
  • Pas un doublon; NumPy a son propre avertissement de l'architecture sur le dessus de Pythons, qui peut être précisément contrôlée (voir la réponse par Bakuríu).
  • Je corrige la position des mains et appris une nouvelle chose. J'ai supprimé mon commentaire d'origine pour éviter le déclenchement de l'insigne de la collection de la frénésie.
  • Une autre approche que l'on pourrait utiliser est tout simplement de vérifier si le dénominateur est de 0 avant la division, ce qui évite la surcharge de jongler avec numpy du système d'alerte. (Bien que cela signifie probablement que vous avez à développer neat compréhension de liste dans une boucle de vérifier si l'un des dénominateurs est égale à zéro.)
InformationsquelleAutor John K. | 2013-04-10