linalg.
multi_dot
在单个函数调用中计算两个或多个数组的点积,同时自动选择最快的计算顺序。
multi_dot 链 numpy.dot 并使用矩阵的最佳括号 [1] [2] . 根据矩阵的形状,这可以大大加快乘法的速度。
numpy.dot
如果第一个参数是一维的,则将其视为行向量。如果最后一个参数是一维的,它将被视为列向量。其他参数必须是二维的。
想想 multi_dot AS::
def multi_dot(arrays): return functools.reduce(np.dot, arrays)
如果第一个参数是一维的,则将其视为行向量。如果最后一个参数是一维的,则将其视为列向量。其他参数必须是二维的。
输出参数。如果不使用的话,它必须具有返回的类型。特别是,它必须具有正确的类型,必须是C-连续的,并且它的dtype必须是将为返回的dtype dot(a, b) . 这是一个性能特性。因此,如果不满足这些条件,将引发异常,而不是尝试灵活处理。
1.19.0 新版功能.
返回所提供数组的点积。
参见
带两个参数的点乘。
笔记
矩阵乘法的成本可以用以下函数计算:
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
工具书类
科尔曼,“算法导论”,第15.2章,第370-378页
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)