logsumexp#
- scipy.special.logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False)[Quelle]#
Berechnet den Logarithmus der Summe der Exponentialfunktionen der Eingabeelemente.
- Parameter:
- aarray_like
Eingabearray.
- axisNone oder int oder Tupel von ints, optional
Achse oder Achsen, über die die Summe gebildet wird. Standardmäßig ist axis None und alle Elemente werden summiert.
Hinzugefügt in Version 0.11.0.
- barray-ähnlich, optional
Skalierungsfaktor für exp(a) muss die gleiche Form wie a haben oder auf a erweiterbar sein. Diese Werte können negativ sein, um eine Subtraktion zu implementieren.
Hinzugefügt in Version 0.12.0.
- keepdimsbool, optional
Wenn dies auf True gesetzt ist, bleiben die reduzierten Achsen im Ergebnis als Dimensionen mit der Größe eins erhalten. Mit dieser Option wird das Ergebnis korrekt mit dem ursprünglichen Array gestreckt.
Hinzugefügt in Version 0.15.0.
- return_signbool, optional
Wenn dies auf True gesetzt ist, ist das Ergebnis ein Paar, das Zeicheninformationen enthält; wenn False, werden negative Ergebnisse als NaN zurückgegeben. Standard ist False (keine Zeicheninformationen).
Hinzugefügt in Version 0.16.0.
- Rückgabe:
- resndarray
Das Ergebnis,
np.log(np.sum(np.exp(a))), numerisch stabiler berechnet. Wenn b gegeben ist, wirdnp.log(np.sum(b*np.exp(a)))zurückgegeben. Wennreturn_signTrue ist, enthältresden Logarithmus des Absolutwerts des Arguments.- sgnndarray
Wenn
return_signTrue ist, ist dies ein Array von Gleitkommazahlen, das mit res übereinstimmt und +1, 0, -1 (für reellwertige Eingaben) oder eine komplexe Phase (für komplexe Eingaben) enthält. Dies gibt das Vorzeichen des Arguments des Logarithmus inresan. Wennreturn_signFalse ist, wird nur ein Ergebnis zurückgegeben.
Siehe auch
Hinweise
NumPy verfügt über eine Funktion logaddexp, die
logsumexpsehr ähnlich ist, aber nur zwei Argumente verarbeitet. logaddexp.reduce ähnelt dieser Funktion, kann aber weniger stabil sein.Der Logarithmus ist eine mehrdeutige Funktion: für jedes \(x\) gibt es eine unendliche Anzahl von \(z\), so dass \(exp(z) = x\). Die Konvention ist, das \(z\) zurückzugeben, dessen Imaginärteil in \((-pi, pi]\) liegt.
logsumexpunterstützt experimentell auch Backends, die mit dem Python Array API Standard kompatibel sind, zusätzlich zu NumPy. Bitte erwägen Sie, diese Funktionen zu testen, indem Sie die UmgebungsvariableSCIPY_ARRAY_API=1setzen und CuPy-, PyTorch-, JAX- oder Dask-Arrays als Array-Argumente bereitstellen. Die folgenden Kombinationen aus Backend und Gerät (oder anderen Fähigkeiten) werden unterstützt.Bibliothek
CPU
GPU
NumPy
✅
n/a
CuPy
n/a
✅
PyTorch
✅
✅
JAX
✅
✅
Dask
✅
n/a
Siehe Unterstützung für den Array API Standard für weitere Informationen.
Beispiele
>>> import numpy as np >>> from scipy.special import logsumexp >>> a = np.arange(10) >>> logsumexp(a) 9.4586297444267107 >>> np.log(np.sum(np.exp(a))) 9.4586297444267107
Mit Gewichten
>>> a = np.arange(10) >>> b = np.arange(10, 0, -1) >>> logsumexp(a, b=b) 9.9170178533034665 >>> np.log(np.sum(b*np.exp(a))) 9.9170178533034647
Zurückgabe eines Vorzeichenflags
>>> logsumexp([1,2],b=[1,-1],return_sign=True) (1.5413248546129181, -1.0)
Beachten Sie, dass
logsumexpkeine Masked Arrays direkt unterstützt. Um es auf einem Masked Array zu verwenden, wandeln Sie die Maske in Nullgewichte um>>> a = np.ma.array([np.log(2), 2, np.log(3)], ... mask=[False, True, False]) >>> b = (~a.mask).astype(int) >>> logsumexp(a.data, b=b), np.log(5) 1.6094379124341005, 1.6094379124341005