numpy.linalg.multi_dot
-
numpy.linalg.multi_dot(arrays)[source] -
Вычисляет скалярное произведение двух или более массивов в одном вызове функции, автоматически выбирая самый быстрый порядок вычисления.
multi_dotцепочкойnumpy.dotи использует оптимальную скобочную запись матриц [1] [2]. В зависимости от форм матриц это может значительно ускорить умножение.Если первый аргумент является одномерным, он обрабатывается как строка-вектор. Если последний аргумент является одномерным, он обрабатывается как столбец-вектор. Остальные аргументы должны быть двумерными.
Представьте себе
multi_dotкак:def multi_dot(arrays): return functools.reduce(np.dot, arrays)
Параметры: -
arrays : sequence of array_like -
Если первый аргумент является одномерным, он обрабатывается как строка-вектор. Если последний аргумент является одномерным, он обрабатывается как столбец-вектор. Остальные аргументы должны быть двумерными.
Возвращает: -
output : ndarray -
Возвращает скалярное произведение предоставленных массивов.
См. также
-
dot - умножение dot с двумя аргументами.
Примечания
Стоимость матричного умножения может быть вычислена с помощью следующей функции:
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
Ссылки
[1] (1, 2) Кормен, «Введение в алгоритмы», Глава 15.2, стр. 370-378 [2] (1, 2) http://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–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.15.4/reference/generated/numpy.linalg.multi_dot.html