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)