numpy.einsum_path#
- numpy.einsum_path(subscripts, *operands, optimize='greedy')[源代码]#
通过考虑中间数组的创建,评估einsum表达式的最低成本收缩顺序.
- 参数:
- subscriptsstr
指定求和的下标.
- *operands数组类列表
这些是操作的数组.
- optimize{bool, list, tuple, ‘greedy’, ‘optimal’}
选择路径的类型.如果提供了一个元组,则假设第二个参数是创建的最大中间大小.如果只提供了一个参数,则使用最大输入或输出数组大小作为最大中间大小.
如果给定的列表以
einsum_path
开头,则使用此作为收缩路径如果为假,则不进行优化
如果为真,默认使用 ‘贪婪’ 算法
‘optimal’ 一种组合探索所有可能的收缩列表张量的方法并选择成本最低路径的算法.随着收缩项数的增加,其规模呈指数增长.
‘greedy’ 是一种在每一步选择最佳对收缩的算法.实际上,该算法在每一步搜索最大的内积、Hadamard积,然后是外积.随着收缩项数的立方倍数缩放.对于大多数收缩等同于’optimal’路径.
默认是 ‘greedy’.
- 返回:
- path元组列表
einsum 路径的列表表示.
- string_reprstr
einsum 路径的可打印表示.
备注
生成的路径指示输入收缩的哪些项应首先收缩,此收缩的结果随后附加到收缩列表的末尾.然后可以迭代此列表,直到所有中间收缩完成.
示例
我们可以从一个链点例子开始.在这种情况下,最好先收缩
b
和c
张量,如路径(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