numpy.linalg.multi_dot#
- linalg.multi_dot(arrays, *, out=None)[源代码]#
在一个函数调用中计算两个或更多数组的点积,同时自动选择最快的评估顺序.
multi_dot
链式调用numpy.dot
并使用矩阵的最佳括号化 [1] [2].根据矩阵的形状,这可以大大加快乘法运算.如果第一个参数是1-D,它被视为行向量.如果最后一个参数是1-D,它被视为列向量.其他参数必须是2-D.
将
multi_dot
视为:def multi_dot(arrays): return functools.reduce(np.dot, arrays)
- 参数:
- arrayssequence of array_like 的序列
如果第一个参数是1-D,则将其视为行向量.如果最后一个参数是1-D,则将其视为列向量.其他参数必须是2-D.
- outndarray, 可选
输出参数.这必须具有如果未使用它时将返回的确切类型.特别是,它必须具有正确的类型,必须是C-连续的,并且其dtype必须是`dot(a, b)`将返回的dtype.这是一个性能特性.因此,如果这些条件不满足,则会引发异常,而不是试图变得灵活.
在 1.19.0 版本加入.
- 返回:
- outputndarray
返回提供的数组的点积.
参见
numpy.dot
带有两个参数的点乘法.
备注
矩阵乘法的成本可以通过以下函数计算:
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
参考文献
[1]Cormen, “算法导论”, 第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)