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 路徑的可列印表示。

註解

結果路徑指示應首先收縮輸入收縮的哪些項,然後將此收縮的結果附加到收縮列表的末尾。然後可以迭代此列表,直到所有中間收縮完成。

範例

我們可以從鏈式點積範例開始。在這種情況下,最好先收縮 bc 張量,如路徑 (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