在Python中评估一个einsum表达式的最低成本收缩顺序
在这篇文章中,我们将看到如何在Python中评估一个einsum表达式的低成本收缩。
np.einsum_path 方法
为了获得Python中爱因斯坦表达式的最低成本收缩顺序,请使用numpy .einsum path()函数。爱因斯坦求和惯例可以用来表示几种常见的多维线性代数数组操作。在隐式模式下,Einsum计算这些值。Einsum通过禁用或强制跨定义的下标标签求和,为计算在显式模式下可能不被认为是标准的爱因斯坦求和操作提供额外的灵活性。路径表明哪些项应该首先被收缩,结果被附加到收缩列表的末尾。然后,这个列表可以迭代,直到完成所有间隔的收缩。
语法: np.einsum_path(subscripts, *operands, optimize='greedy')
参数:
- subscripts:字符串类型。指定用于求和的副标。
- *operands : array_like对象的列表。这些是操作的数组。
- optimize : {bool, list, tuple, ‘greedy’, ‘optimal’ }。选择路径的类型。
返回值:
- path : 图元的列表。einsum路径被表示为一个列表。
- string_repr: str.einsum路径的可打印表示。
示例
这里导入了库,np.random.rand()方法被用来生成随机数数组。我们做了三个数组,分别称为a、b和c。使用np.einsum path()方法来评估einsum表达式的低成本收缩值。让我们从一个链点图示开始。在这种情况下,b和c张量应该首先被收缩,如路径的第一个元素(1,2)所示。最后的收缩(0, 1)是通过将产生的张量附加到收缩的末端来完成的。
# importing packages
import numpy as np
# setting seed
np.random.seed(101)
# creating random arrays
a = np.random.rand(2, 2)
print(a)
b = np.random.rand(2, 3)
print(b)
c = np.random.rand(3, 2)
print(c)
# lowest cost contraction order for an einsum expression
path = np.einsum_path('ij,jk,kl->il', a, b, c, optimize='greedy')
# Path info
print(path[0])
print(path[1])
输出:
[[0.51639863 0.57066759]
[0.02847423 0.17152166]]
[[0.68527698 0.83389686 0.30696622]
[0.89361308 0.72154386 0.18993895]]
[[0.55422759 0.35213195]
[0.1818924 0.78560176]
[0.96548322 0.23235366]]
[‘einsum_path’, (1, 2), (0, 1)]
Complete contraction: ij,jk,kl->il
Naive scaling: 4
Optimized scaling: 3
Naive FLOP count: 7.200e+01
Optimized FLOP count: 4.100e+01
Theoretical speedup: 1.756
Largest intermediate: 4.000e+00 elements
————————————————————————–
scaling current remaining
————————————————————————–
3 kl,jk->jl ij,jl->il
3 jl,ij->il il->il