Numpy Problem: divide by zero in log10

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dax5
User
Beiträge: 7
Registriert: Sonntag 3. Februar 2013, 18:13

Hallo,

ich erhalte bei der numpy.log10 Funktion für manche valueWatt-Werte den Fehler, dass durch Null geteilt wird. Hier der Code:

Code: Alles auswählen

def convertWattToDbm(valueWatt):
    valueDbm = 10* NP.log10(valueWatt)
    return valueDbm
Bei welchen Werten von "valueWatt" teilt die log10 Fkt. durch Null? Und wieso teilt Numpy für die Log-Berechnung überhaupt durch Null?
Danke für Eure Hilfe!


PS: genaue Fehlermeldung lautet "RuntimeWarning: divide by zero encountered in log10"
BlackJack

@dax5: Wenn man *eine* Logarithmusfunktion zu irgendeiner Basis z hat, kann man damit eine Logarithmus zu einer anderen Basis b wie folgt berechnen ``log(b, x) = log_z(x) / log_z(b)``. Das wäre natürlich jetzt keine Erklärung für Deine Ausnahme.

Finde doch einfach mal ein konkretes Beispiel für einen Wert wo das passiert.
dax5
User
Beiträge: 7
Registriert: Sonntag 3. Februar 2013, 18:13

Hey danke für die Antwort BlackJack!
Daraus leite ich jetzt einfach mal ab, dass Numpy den 10er Log durch Verwendung einer anderen Basis (z) verwendet, richtig? Verstehe zwar den Sinn dahinter nicht, da auch über die andere Basis (z) der Log(x) berechnet werden muss. Zumindest ist es aber eine Erklärung für den div-durch-0-Fehler.
Ein Wert, bei dem die Meldung erscheint ist: valueWatt == -inf (Symbol für "kein Wert"). Dass -inf(inity) keinen Log hat, ist klar. Ob die Fehlermeldung an dieser Stelle aber akkurat ist, ...? Weitere Werte mit Fehlermeldung habe ich bisher nicht ausfindig machen können.
BlackJack

@dax5: Der Sinn dahinter ist, dass man nur den Logarithmus zu *einer* Basis tatsächlich auch implementieren muss und mit *der* Funktion dann Logarithmen zu allen anderen Basen berechnen kann. Dazu sucht man sich eine Basis bei der das möglichst einfach geht. Beim üblichen Rechner zum Beispiel die Basis 2, weil man im Binärsystem grob gesagt nur zählen muss an welcher Stelle das höchstwertige Bit links vom Komma steht. Und damit kann man dann durch zweimaliges anwenden und eine Division Logarithmen in allen anderen Basen berechnen.

Den Fehler kann ich übrigens nicht nachvollziehen, das ist also keine Erklärung IMHO:

Code: Alles auswählen

In [114]: np.log10(-np.inf)
Out[114]: nan
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

dax5 hat geschrieben:Daraus leite ich jetzt einfach mal ab, dass Numpy den 10er Log durch Verwendung einer anderen Basis (z) verwendet, richtig? Verstehe zwar den Sinn dahinter nicht, da auch über die andere Basis (z) der Log(x) berechnet werden muss. Zumindest ist es aber eine Erklärung für den div-durch-0-Fehler.
Ganz einfach: Man muss nicht für JEDE Basis eine eigene log-Funktion schreiben und muss nur eine Funktion optimieren und pflegen. Wie BlackJack aber schon geschrieben hat, kann dies keinen Fehler bezüglich Division durch 0 auslösen. log(10), egal zu welcher Basis, ist nie 0.

Was bei inf passiert, müsste man sich in der Tat mal genauer in der Dokumentation oder im Code anschauen. Und es stellt sich die Frage, warum du überhaupt inf-Werte bekommst. "Kein Wert" würde man eher mit "NaN" ausdrücken, auser -inf und inf ergeben tatsächlich einen Sinn, weil diese zusätzliche Information liefern oder ähnliches.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist tatsächlich so, dass bei mir log(0) eine divide-by-zero-Warnung ausgibt. Das liegt höchstwahrscheinlich an der internen Implementierung, da -1/0=-inf ja das richtige Ergebnis ist, eine Warnung in diesem Fall also nicht unbedingt nötig ist.
dax5
User
Beiträge: 7
Registriert: Sonntag 3. Februar 2013, 18:13

Ok, die Implementierung nur einer Log-Fkt. macht Sinn...

SORRY, ES BESTAND EINE VERWECHSLUNG AUF MEINER SEITE:
Die "-inf" Werte sind die Outputs der Fkt. (nicht die Inputs/valueWatt-Werte). Bin da blöderweise durcheinander gekommen!
Numpy errechnet -inf bei Input valueWatt == 0, was auch korrekt ist. Allerdings entsteht bei diesen 0-Inputwerten auch kein Div-durch-0-Fehler! getestet unter Eclipse-Pydev und IPython:
In [4]: 10*N.log10(0)
Out[4]: -inf

Es müssen also andere Werte sein, die den Fehler auslösen. Nur wie lassen sich die ermitteln? :K

PS: Die eigentlich entscheidende Frage wäre, ob ich die Fehlermeldung ignorieren kann und die Umrechnung zumindest keine zusätzlichen Fehler in den Folgeberechnungen verursacht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

dax5 hat geschrieben:Es müssen also andere Werte sein, die den Fehler auslösen. Nur wie lassen sich die ermitteln? :K
Tja, da hilft wohl nur binäre (Fehler-)Suche auf den Daten. Verkleinere einfach die Daten so lange, bis du den Fehler hast.
dax5 hat geschrieben:PS: Die eigentlich entscheidende Frage wäre, ob ich die Fehlermeldung ignorieren kann und die Umrechnung zumindest keine zusätzlichen Fehler in den Folgeberechnungen verursacht.
Ignorieren von Fehlermeldungen ist nie eine gute Idee, wenn man nicht weiß woher die Fehler kommen. Du kannst dich also nach der Fehlersuche darüber ärgern, ob die Suche umsonst war oder nicht ;-)
Das Leben ist wie ein Tennisball.
dax5
User
Beiträge: 7
Registriert: Sonntag 3. Februar 2013, 18:13

Alles klar, vielen Dank für eure Hilfe bis dato!!
Antworten