当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。