numpy.linalg.multi_dot
-
numpy.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)
- Параметры
-
-
arrayssequence of array_like -
Если первый аргумент является одномерным, он рассматривается как строка. Если последний аргумент является одномерным, он рассматривается как столбец. Другие аргументы должны быть двумерными.
-
outndarray, optional -
Аргумент вывода. Он должен иметь ровно тот же тип, который возвращался бы, если бы он не использовался. В частности, он должен иметь правильный тип, быть непрерывным по C и его тип данных должен быть тем же, что и возвращаемый для
dot(a, b). Это функция производительности. Поэтому, если эти условия не выполняются, генерируется исключение, вместо попытки быть гибким.Добавлена в версии 1.19.0.
-
- Возвращает
-
-
outputndarray -
Возвращает скалярное произведение переданных массивов.
-
См. также
-
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 -
Кормен, «Введение в алгоритмы», глава 15.2, стр. 370-378
-
2
Примеры
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–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/generated/numpy.linalg.multi_dot.html