scipy.special.

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, wird np.log(np.sum(b*np.exp(a))) zurückgegeben. Wenn return_sign True ist, enthält res den Logarithmus des Absolutwerts des Arguments.

sgnndarray

Wenn return_sign True 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 in res an. Wenn return_sign False ist, wird nur ein Ergebnis zurückgegeben.

Hinweise

NumPy verfügt über eine Funktion logaddexp, die logsumexp sehr ä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.

logsumexp unterstü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 Umgebungsvariable SCIPY_ARRAY_API=1 setzen 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 logsumexp keine 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