Skip to content

Latest commit

 

History

History
109 lines (78 loc) · 3.9 KB

np126_0559.md

File metadata and controls

109 lines (78 loc) · 3.9 KB

numpy.einsum_path

原文:numpy.org/doc/1.26/reference/generated/numpy.einsum_path.html

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

通过考虑中间数组的创建,评估einsum表达式的最低成本收缩顺序。

参数:

subscripts字符串

指定求和的下标。

*operands数组列表

这些是操作的数组。

optimize{布尔值,列表,元组,‘贪婪’,‘最佳’}

选择路径类型。如果提供了一个元组,则假定第二个参数是创建的最大中间大小。如果只提供了一个参数,则使用最大输入或输出数组大小作为最大中间大小。

  • 如果给定以einsum_path开头的列表,则将其用作收缩路径

  • 如果为 False,则不进行优化

  • 如果为 True,默认为‘贪婪’算法

  • ‘最佳’ 一种算法,通过组合地探索列出的张量的所有可能的收缩方式,并选择成本最低的路径。随着收缩项数量的增加呈指数级增长。

  • ‘贪婪’ 一种算法,每一步选择最佳的对收缩。实际上,该算法在每一步搜索最大的内部、Hadamard,然后外部乘积。随着收缩项数量的增加呈立方比例增长。对于大多数收缩来说,等同于‘最佳’路径。

默认为‘贪婪’。

返回:

path元组列表

一个einsum路径的列表表示。

string_repr字符串

einsum路径的可打印表示。

另请参阅

einsum, linalg.multi_dot

注意

结果路径指示应首先收缩输入收缩的哪些项,然后将此收缩的结果附加到收缩列表的末尾。然后可以对此列表进行迭代,直到所有中间收缩完成。

示例

我们可以从一个链点示例开始。在这种情况下,最佳的做法是首先收缩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