python3的张量网络收缩函数。
ncon的Python项目详细描述
NCO公司
nco是一个Python 3包,它实现了nco函数,如下所述: https://arxiv.org/abs/1402.0939 这个Python实现缺少在 但界面是一样的。在
nco需要numpy并使用numpy ndarray。它也适用于 来自this包的各种张量, 但并不需要。在
安装
pip install --user ncon
使用
此包导出的唯一内容是函数ncon
。它需要一个列表
要收缩的张量,以及一个列表索引列表,该列表指定
与之签约。它返回一个张量,这是
收缩。语法的工作原理如下:
ncon(L, v, order=None, forder=None, check_indices=True):
第一个参数L
是张量的列表。
第二个参数v
是一个列表列表列表,L
中每个张量对应一个。
每个v[i]
由整数组成,每个整数都标记一个L[i]
的索引。
正面标签表示要收缩的指数(总计)。
因此,如果例如v[m][i] == 2
和v[n][j] == 2
,那么
L[m]
和{L[n]
的第j
个索引将被识别和总结。
负号标记将保持自由(不受约束)的索引。在
关键字参数order
是所有正标签的列表,其中
指定成对张量收缩的执行顺序。
默认情况下,它是sorted(all-positive-numbers-in-v)
,例如
[1,2,...]
。注意,当连接两个张量的索引即将
收缩在一起,ncon
同时收缩所有连接的指数
这两个张量,即使他们中的一些只是后来才出现。在
相应地,forder
指定剩余空闲的顺序
索引将被置换。默认情况下是
sorted(all-negative-numbers-in-v, reverse=True)
,
例如[-1,-2,...]
。在
如果check_indices=True
(默认值),则执行检查以确保
收缩是明确的。如果不是,则使用
提供了错误的描述。在
如果语法听起来很像爱因斯坦求和,例如
通过np.einsum
,那是因为它是。ncon
的好处很多
张量网络已经习惯了它的语法,而且它很容易动态地
生成索引列表和收缩。在
示例
这里有几个例子,直接来自测试文件。在
矩阵乘积:
^{pr2}$这里收缩了a
的最后一个索引和{-1
和-2
标记。
标有-1
的索引将成为结果的第一个索引。如果我们给
附加参数forder=[-2,-1]
将返回转换。在
一个更复杂的例子:
b = np.random.randn(5, 3, 6, 7, 6) c = np.random.randn(7, 2) d = np.random.randn(8) e = np.random.randn(8, 9) result_ncon = ncon( (a, b, c, d, e), ([3, -2, 2], [2, 3, 1, 4, 1], [4, -1], [5], [5, -3]) ) result_np = np.einsum("ijk,kilml,mh,q,qp->hjp", a, b, c, d, e) assert np.allclose(result_ncon, result_np)
{{cd32>这里没有连接,注意
和其他人一起。当收缩断开的网络时,连接的
零件总是先收缩,它们的张量积在
结束。跟踪也可以,比如这里的两个索引c
。默认情况下
收缩按[1,2,3,4,5]的顺序进行。这可能不是最佳选择
在这种情况下,我们应该指定一个更好的收缩顺序作为关键字
争论。在
- 项目
标签: