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
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