在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)
为了获得一个求和表达式的最低成本缩减顺序,可以使用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