NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.einsum_path
numpy.
einsum_path
(下标,* operands,optimize ='greedy' )[源代码] ¶通过考虑中间数组的创建,评估einsum表达式的最低成本收缩顺序。
指定求和的下标。
这些是用于操作的数组。
选择路径类型。如果提供了元组,则第二个参数假定为创建的最大中间大小。如果仅提供单个参数,则将最大输入或输出数组大小用作最大中间大小。
如果给出以开头的列表,则将其einsum_path
用作收缩路径
如果为False,则不进行优化
如果True默认为'贪心'算法
“最优”一种算法,可综合探索列出的张量收缩和选择成本最低的路径的所有可能方式。与收缩中的项数成指数比例增长。
'贪婪'一种算法,它在每个步骤中选择最佳的对收缩。有效地,此算法在每个步骤中搜索最大的内部产品,Hadamard,然后搜索外部产品。与收缩项的数量成立方比例。相当于大多数收缩的“最佳”路径。
默认值为“贪心”。
einsum路径的列表表示形式。
einsum路径的可打印表示形式。
也可以看看
笔记
生成的路径指示应首先收缩输入收缩的哪些术语,然后将该收缩的结果附加到收缩列表的末尾。然后可以迭代此列表,直到完成所有中间收缩。
例子
我们可以从一个链点示例开始。在这种情况下,最好先收缩b
和c
张量,如path的第一个元素所示。将所得张量添加到收缩的末尾,然后完成剩余的收缩。(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