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]Предположим, у нас есть три матрицы
.
Стоимость для двух различных скобочных записей представлена следующим образом:
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
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