Spec-Zone.ru › NumPy 1.20

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

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

См. также

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

Кормен, «Введение в алгоритмы», глава 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–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/generated/numpy.linalg.multi_dot.html

Spec-Zone.ru

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