numpy.einsum_path#
- numpy.einsum_path(subscripts, *operands, optimize='greedy')[來源]#
透過考量建立中間陣列,評估 einsum 表達式的最低成本收縮順序。
- 參數:
- subscriptsstr
指定求和的下標。
- *operandsarray_like 列表
這些是運算的陣列。
- optimize{bool, list, tuple, ‘greedy’, ‘optimal’}
選擇路徑的類型。如果提供元組,則第二個參數假設為建立的最大中間大小。如果僅提供單一參數,則最大輸入或輸出陣列大小將用作最大中間大小。
如果給定的列表以
einsum_path
開頭,則將其用作收縮路徑如果為 False,則不進行最佳化
如果為 True,則預設為 ‘greedy’ 演算法
‘optimal’ 一種組合地探索列出張量的所有可能收縮方式,並選擇成本最低路徑的演算法。隨著收縮項目的數量呈指數級擴展。
‘greedy’ 一種在每個步驟選擇最佳配對收縮的演算法。實際上,此演算法在每個步驟中搜尋最大的內部乘積、哈達瑪乘積,然後是外部乘積。隨著收縮項目的數量呈立方級擴展。對於大多數收縮,等效於 ‘optimal’ 路徑。
預設值為 ‘greedy’。
- 返回:
- path元組列表
einsum 路徑的列表表示。
- string_reprstr
einsum 路徑的可列印表示。
註解
結果路徑指示應首先收縮輸入收縮的哪些項,然後將此收縮的結果附加到收縮列表的末尾。然後可以迭代此列表,直到所有中間收縮完成。
範例
我們可以從鏈式點積範例開始。在這種情況下,最好先收縮
b
和c
張量,如路徑(1, 2)
的第一個元素所表示。產生的張量將新增至收縮的末尾,然後完成剩餘的收縮(0, 1)
。>>> np.random.seed(123) >>> a = np.random.rand(2, 2) >>> b = np.random.rand(2, 5) >>> c = np.random.rand(5, 2) >>> path_info = np.einsum_path('ij,jk,kl->il', a, b, c, optimize='greedy') >>> print(path_info[0]) ['einsum_path', (1, 2), (0, 1)] >>> print(path_info[1]) Complete contraction: ij,jk,kl->il # may vary Naive scaling: 4 Optimized scaling: 3 Naive FLOP count: 1.600e+02 Optimized FLOP count: 5.600e+01 Theoretical speedup: 2.857 Largest intermediate: 4.000e+00 elements ------------------------------------------------------------------------- scaling current remaining ------------------------------------------------------------------------- 3 kl,jk->jl ij,jl->il 3 jl,ij->il il->il
更複雜的索引轉換範例。
>>> I = np.random.rand(10, 10, 10, 10) >>> C = np.random.rand(10, 10) >>> path_info = np.einsum_path('ea,fb,abcd,gc,hd->efgh', C, C, I, C, C, ... optimize='greedy')
>>> print(path_info[0]) ['einsum_path', (0, 2), (0, 3), (0, 2), (0, 1)] >>> print(path_info[1]) Complete contraction: ea,fb,abcd,gc,hd->efgh # may vary Naive scaling: 8 Optimized scaling: 5 Naive FLOP count: 8.000e+08 Optimized FLOP count: 8.000e+05 Theoretical speedup: 1000.000 Largest intermediate: 1.000e+04 elements -------------------------------------------------------------------------- scaling current remaining -------------------------------------------------------------------------- 5 abcd,ea->bcde fb,gc,hd,bcde->efgh 5 bcde,fb->cdef gc,hd,cdef->efgh 5 cdef,gc->defg hd,defg->efgh 5 defg,hd->efgh efgh->efgh