scipy.special.

logsumexp#

scipy.special.logsumexp(a, ось=None, b=None, keepdims=False, return_sign=False)[источник]#

Вычислить логарифм суммы экспонент входных элементов.

Параметры:
aarray_like

Входной массив.

осьNone или int или кортеж ints, опционально

Ось или оси, по которым берется сумма. По умолчанию ось равно None, и все элементы суммируются.

Добавлено в версии 0.11.0.

bподобный массиву, необязательный

Масштабный коэффициент для 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
numpy.logaddexp2

Примечания

NumPy имеет функцию logaddexp, которая очень похожа на logsumexp, но обрабатывает только два аргумента. logaddexp.reduce похожа на эту функцию, но может быть менее стабильной.

Логарифм — многозначная функция: для каждого \(x\) существует бесконечное число \(z\) такой, что \(exp(z) = x\). Соглашение заключается в возврате \(z\) мнимая часть которого лежит в \((-pi, pi]\).

logsumexp имеет экспериментальную поддержку совместимых с Python Array API Standard бэкендов в дополнение к NumPy. Пожалуйста, рассмотрите тестирование этих функций, установив переменную окружения SCIPY_ARRAY_API=1 и предоставление массивов CuPy, PyTorch, JAX или Dask в качестве аргументов массива. Поддерживаются следующие комбинации бэкенда и устройства (или других возможностей).

Библиотека

CPU

GPU

NumPy

н/д

CuPy

н/д

PyTorch

JAX

Dask

н/д

См. Поддержка стандарта array API для получения дополнительной информации.

Примеры

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