2012-05-09 19 views
14

Ich entwarf eine einfache Funktion, um eine mathematische Funktion zurückzugeben, die verwendet werden kann, um experimentelle Daten daran anzupassen. Die Funktionen sieht ziemlich ähnlich wie folgt aus:Python: Wie vermeiden Sie numpy RuntimeWarning in Funktionsdefinition?

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)) 

Leider in Schwierigkeiten mit RunTimeWarnings wie ich laufen:

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

aufgrund Werte, die zu groß oder klein sind. Ich bin jedoch nicht in der Lage, dieses Problem alleine zu lösen. Gibt es eine Möglichkeit, meine Funktion neu zu definieren, so dass sie ohne Warnungen passieren wird?

+0

Wissen Sie, wie Sie Ausnahmen erfassen können? –

+0

@StevenRumbalski, Diese wurden nicht erhoben. –

+0

@MikeGraham: Mein schlechtes. Ich habe Ihre Frage missverstanden * und * verpasst, dass es sich um Warnungen handelt. warnings.warn ("veraltet", DeprecationWarning) mit warnings.catch_warnings():: warnings.simplefilter ("ignorieren") FXN –

Antwort

30

Sie können numpy.errstate verwenden, welcher Kontext ein eingebauter, ist Manager. Dadurch können Sie festlegen, dass die Fehlerübergabe im Kontext der with-Anweisung steht.

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

Ich hatte dies vor kurzem zu tun, wenn für einige Legacy-Python-Code Unit-Tests zu schreiben.

+0

Beste Antwort bei weitem; einfach und sehr lesbar. –

2

Um dies zu umgehen, könnten Sie die Genauigkeit erhöhen, indem Sie den Typ der Array-Elemente ändern, auf denen Sie Ihre Funktion aufrufen.

Wenn beispielsweise Array Multiplizieren a mit großen Zahlen als Elemente von einem großen Gleitkommazahl löst eine Exception

RuntimeWarning: overflow encountered in multiply 

dann auf folgende Angaben:

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

keine Warnung erfolgt.

Verwandte Themen