Spec-Zone.ru › NumPy 2.0

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)
Параметры:
arraysпоследовательность array_like

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

outndarray, необязательно

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

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

Возвращаемое значение:
outputndarray

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

См. также

numpy.dot

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

Примечания

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

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

Ссылки

[1]

Кормен, «Введение в алгоритмы», глава 15.2, стр. 370-378

[2]

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

Примеры

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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.linalg.multi_dot.html

Spec-Zone.ru

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