評估 Python 中 einsum 表示式的最低成本收縮順序


要獲得 einsum 表示式的最低成本收縮順序,請在 Python 中使用 numpy.einsum_path() 方法。第一個引數 subscripts 指定求和的下標。第二個引數 operands 是操作的陣列。

使用愛因斯坦求和約定,許多常見的多分量線性代數陣列運算可以用簡單的方式表示。在隱式模式下,einsum 計算這些值。

在顯式模式下,einsum 透過停用或強制對指定下標標籤進行求和,提供了進一步的靈活性來計算可能不被認為是經典愛因斯坦求和運算的其他陣列運算。

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

步驟

首先,匯入所需的庫:

import numpy as np

張量:

p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

要獲得 einsum 表示式的最低成本收縮順序,請使用 numpy.einsum_path() 方法:

path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

顯示路徑資訊:

print(path_info[0])
print(path_info[1])

示例

import numpy as np
np.random.seed(123)

# Tensors
p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

# To get the lowest cost contraction order for an einsum expression, use the numpy.einsum+path() method in Python
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

# Displaying Path info
print(path_info[0])
print(path_info[1])

輸出

['einsum_path', (1, 2), (0, 1)]
  Complete contraction:  ij,jk,kl->il
         Naive scaling:  4
     Optimized scaling:  3
      Naive FLOP count:  1.200e+02
  Optimized FLOP count:  5.700e+01
   Theoretical speedup:  2.105
  Largest intermediate:  4.000e+00 elements
--------------------------------------------------------------------------
scaling                 current                   remaining
--------------------------------------------------------------------------
   3                 kl,jk->jl                  ij,jl->il
   3                 jl,ij->il                     il->il

更新於:2022年3月2日

126 次瀏覽

開始你的職業生涯

透過完成課程獲得認證

開始
廣告