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)
参数:
arrays序列 array_like

如果第一个参数是 1-D,则将其视为行向量。如果最后一个参数是 1-D,则将其视为列向量。其他参数必须是 2-D。

outndarray,可选

输出参数。这必须具有如果不使用它就会返回的确切种类。特别是,它必须具有正确的类型,必须是 C contiguous 的,并且其 dtype 必须是为 dot(a, b) 返回的 dtype。这是一个性能特性。因此,如果不满足这些条件,则会引发异常,而不是尝试灵活处理。

返回:
outputndarray

返回 supplied 数组的点积。

另请参阅

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]

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)