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, которая очень похожа на
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