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 - умножение точками с двумя аргументами.
Примечания
Стоимость умножения матриц может быть вычислена с помощью следующей функции:
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] Кормен, «Введение в алгоритмы», глава 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–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/generated/numpy.linalg.multi_dot.html