當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python numpy einsum_path用法及代碼示例


本文簡要介紹 python 語言中 numpy.einsum_path 的用法。

用法:

numpy.einsum_path(subscripts, *operands, optimize='greedy')

通過考慮中間數組的創建來評估 einsum 表達式的最低成本收縮順序。

參數

subscripts str

指定求和的下標。

*operands 數組 列表

這些是操作的數組。

optimize {布爾,列表,元組,‘greedy’, ‘optimal’}

選擇路徑類型。如果提供了元組,則假定第二個參數是創建的最大中間大小。如果僅提供一個參數,則最大輸入或輸出數組大小用作最大中間大小。

  • 如果給出一個以 einsum_path 開頭的列表,則使用它作為收縮路徑

  • 如果 False 不進行優化

  • 如果 True 默認為 ‘greedy’ 算法

  • ‘optimal’ 一種算法,它組合探索所有可能的收縮列出張量的方法並選擇成本最低的路徑。與收縮中的項數成 index 關係。

  • ‘greedy’ 在每一步選擇最佳對收縮的算法。實際上,該算法在每一步搜索最大的內積、Hadamard 積,然後是外積。隨收縮中的項數立方縮放。相當於大多數宮縮的‘optimal’ 路徑。

默認為‘greedy’。

返回

path 元組列表

einsum 路徑的列表表示。

string_repr str

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

相關用法


注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.einsum_path。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。