web-dev-qa-db-fra.com

Python: Comment éviter numpy RuntimeWarning dans la définition de fonction?

j'ai conçu une fonction simple pour renvoyer une fonction mathématique qui peut être utilisée pour y ajuster des données expérimentales. Les fonctions ressemblent à peu près à ce qui suit:

def colecole_2(f,*p):
    term1=p[0] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[1], p[2])))
    term2=p[3] * ( 1 - 1 / (1 + numpy.power((0+1j) * 2 * numpy.pi * f * p[4], p[5])))
    return p[6]*(1-abs( term1+ term2))

Malheureusement, je rencontre des problèmes avec RunTimeWarnings en tant que:

RuntimeWarning: overflow encountered in power
RuntimeWarning: overflow encountered in divide

en raison de valeurs trop grandes ou trop petites. Je ne suis pas en mesure de comprendre ce problème par moi-même cependant. Existe-t-il un moyen de redéfinir ma fonction pour qu'elle passe sans avertissement?

18
Gjan

Utilisation numpy.seterr pour contrôler ce que numpy fait dans ce cas: http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

Utilisez le module des avertissements pour contrôler la façon dont les avertissements sont ou ne sont pas présentés: http://docs.python.org/library/warnings.html

17
Mike Graham

Vous pouvez utiliser numpy.errstate qui est un gestionnaire de contexte intégré. Cela vous permettra de définir la remise d'erreur dans le contexte de l'instruction with.

import numpy
# warning is not logged here. Perfect for clean unit test output
with numpy.errstate(divide='ignore'):
    numpy.float64(1.0) / 0.0

J'ai dû le faire récemment lors de l'écriture de tests unitaires pour un certain code python.

42
Jay P.

Pour contourner cela, vous pouvez augmenter la précision en modifiant le type des éléments du tableau sur lesquels vous appelez votre fonction.

Par exemple, si vous multipliez un tableau une avec de grands nombres comme éléments par un grand nombre à virgule flottante déclenche une exception

RuntimeWarning: overflow encountered in multiply

puis en spécifiant ce qui suit

a = np.array(a, dtype=np.float128)

aucun avertissement ne se produit.

3
alexs