numpy.linalg.multi_dot#

linalg.multi_dot(массивы, *, выход=None)[источник]#

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

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

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

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

def multi_dot(arrays): return functools.reduce(np.dot, arrays)
Параметры:
массивыпоследовательность объектов, подобных массивам

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

выходndarray, необязательно

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

Возвращает:
выводndarray

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

Смотрите также

numpy.dot

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

Примечания

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

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

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

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

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

Ссылки

[1]

Кормен, «Алгоритмы: построение и анализ», глава 15.2, стр. 370-378

Примеры

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

>>> import numpy as np
>>> 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)