numpy.linalg.multi_dot#

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)
參數:
arraysarray_like 序列

如果第一個參數是一維的,則視為列向量。如果最後一個參數是一維的,則視為行向量。其他參數必須是二維的。

outndarray,選用

輸出參數。這必須具有與未使用時返回的完全相同的種類。特別是,它必須具有正確的型別、必須是 C 相鄰的,並且其 dtype 必須是 dot(a, b) 返回的 dtype。這是一項效能功能。因此,如果未滿足這些條件,則會引發例外,而不是嘗試彈性處理。

回傳值:
outputndarray

回傳所提供陣列的點積。

另請參閱

numpy.dot

帶有兩個參數的 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)