scipy.special.

logsumexp#

scipy.special.logsumexp(a, axis=None, b=None, keepdims=False, return_sign=False)[source]#

計算輸入元素的指數和的對數。

參數:
aarray_like

輸入陣列。

axisNone 或 int 或 int 元組,選用

要計算總和的軸或軸。預設情況下,axis 為 None,並對所有元素求和。

在 0.11.0 版本中加入。

barray-like,選用

exp(a) 的縮放因子,必須與 a 的形狀相同,或可廣播到 a。 這些值可能為負數,以實現減法。

在 0.12.0 版本中加入。

keepdimsbool,選用

如果設定為 True,則縮減的軸將保留在結果中,作為大小為一的維度。 使用此選項,結果將針對原始陣列正確廣播。

在 0.15.0 版本中加入。

return_signbool,選用

如果設定為 True,則結果將會是一對包含符號資訊;如果為 False,則負數結果將以 NaN 傳回。 預設值為 False(無符號資訊)。

在 0.16.0 版本中加入。

傳回值:
resndarray

結果,np.log(np.sum(np.exp(a))) 以數值上更穩定的方式計算。 如果給定 b,則傳回 np.log(np.sum(b*np.exp(a)))。 如果 return_sign 為 True,則 res 包含參數絕對值的對數。

sgnndarray

如果 return_sign 為 True,則這將是一個浮點數陣列,與 res 相符,包含 +1、0、-1(對於實數值輸入)或複數相位(對於複數輸入)。 這給出了 res 中對數參數的符號。 如果 return_sign 為 False,則僅傳回一個結果。

註解

NumPy 有一個 logaddexp 函數,它與 logsumexp 非常相似,但僅處理兩個參數。logaddexp.reduce 與此函數類似,但可能較不穩定。

對數是一個多值函數:對於每個 \(x\),都有無數個 \(z\) 使得 \(exp(z) = x\)。 慣例是傳回虛部位於 \((-pi, pi]\) 中的 \(z\)

範例

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

帶權重

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

傳回符號標誌

>>> logsumexp([1,2],b=[1,-1],return_sign=True)
(1.5413248546129181, -1.0)

請注意,logsumexp 不直接支援遮罩陣列。 若要在遮罩陣列上使用它,請將遮罩轉換為零權重

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