Spec-Zone.ru › NumPy 1.21

numpy.linalg.multi_dot

linalg.multi_dot(arrays, *, out=None)[source]

Вычисление скалярного произведения двух или более массивов в одном вызове функции, автоматически выбирая наилучший порядок вычислений.

multi_dot цепочек numpy.dot и использует оптимальную скобочную запись для матриц [1] [2]. В зависимости от форм матриц это может значительно ускорить умножение.

Если первый аргумент является одномерным, он обрабатывается как строка-вектор. Если последний аргумент является одномерным, он обрабатывается как столбец-вектор. Другие аргументы должны быть двумерными.

Представьте себе multi_dot как:

def multi_dot(arrays): return functools.reduce(np.dot, arrays)
Parameters
arrayssequence of array_like

Если первый аргумент является одномерным, он обрабатывается как строка-вектор. Если последний аргумент является одномерным, он обрабатывается как столбец-вектор. Другие аргументы должны быть двумерными.

outndarray, optional

Аргумент вывода. Он должен иметь точно тот же тип, что и возвращаемый результат без его использования. В частности, он должен иметь правильный тип, быть непрерывным по C и иметь тип данных, который возвращался бы для dot(a, b). Это функция производительности. Поэтому, если эти условия не выполнены, генерируется исключение, вместо попытки быть гибким.

New in version 1.19.0.

Returns
outputndarray

Возвращает скалярное произведение переданных массивов.

See also

numpy.dot

Умножение точкой с двумя аргументами.

Notes

Стоимость умножения матриц может быть вычислена с помощью следующей функции:

def cost(A, B):
    return A.shape[0] * A.shape[1] * B.shape[1]

Предположим, у нас есть три матрицы \(A_{10x100}, B_{100x5}, C_{5x50}\).

Стоимость для двух различных скобочных записей выглядит следующим образом:

cost((AB)C) = 10*100*5 + 10*5*50   = 5000 + 2500   = 7500
cost(A(BC)) = 10*100*50 + 100*5*50 = 50000 + 25000 = 75000

References

1

Cormen, “Введение в алгоритмы”, Глава 15.2, с. 370-378

2

https://en.wikipedia.org/wiki/Matrix_chain_multiplication

Examples

multi_dot позволяет вам написать:

>>> from numpy.linalg import multi_dot
>>> # Prepare some data
>>> A = np.random.random((10000, 100))
>>> B = np.random.random((100, 1000))
>>> C = np.random.random((1000, 5))
>>> D = np.random.random((5, 333))
>>> # the actual dot multiplication
>>> _ = multi_dot([A, B, C, D])

вместо:

>>> _ = np.dot(np.dot(np.dot(A, B), C), D)
>>> # or
>>> _ = A.dot(B).dot(C).dot(D)

© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/generated/numpy.linalg.multi_dot.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API