numpy.linalg.multi_dot#
- linalg.multi_dot(массивы, *, выход=None)[источник]#
Вычислите скалярное произведение двух или более массивов в одном вызове функции, при этом автоматически выбирая самый быстрый порядок вычислений.
multi_dotцепиnumpy.dotи использует оптимальную расстановку скобок матриц [1] [2]. В зависимости от форм матриц это может значительно ускорить умножение.Если первый аргумент является одномерным, он рассматривается как вектор-строка. Если последний аргумент является одномерным, он рассматривается как вектор-столбец. Остальные аргументы должны быть двумерными.
Представьте себе
multi_dotкак:def multi_dot(arrays): return functools.reduce(np.dot, arrays)
- Параметры:
- массивыпоследовательность объектов, подобных массивам
Если первый аргумент является одномерным, он рассматривается как вектор-строка. Если последний аргумент является одномерным, он рассматривается как вектор-столбец. Остальные аргументы должны быть двумерными.
- выходndarray, необязательно
Выходной аргумент. Он должен иметь точный вид, который был бы возвращен, если бы не использовался. В частности, он должен иметь правильный тип, быть C-непрерывным, и его dtype должен быть dtype, который был бы возвращен для dot(a, b). Это функция производительности. Поэтому, если эти условия не выполнены, возникает исключение, вместо попытки быть гибким.
- Возвращает:
- выводndarray
Возвращает скалярное произведение предоставленных массивов.
Смотрите также
numpy.dotскалярное умножение с двумя аргументами.
Примечания
Стоимость умножения матриц может быть рассчитана с помощью следующей функции:
def cost(A, B): return A.shape[0] * A.shape[1] * B.shape[1]
Предположим, у нас есть три матрицы \(A_{10 \times 100}, B_{100 \times 5}, C_{5 \times 50}\).
Стоимости для двух различных расстановок скобок следующие:
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
Примеры
multi_dotпозволяет вам писать:>>> import numpy as np >>> 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)