Numpys`tensordot`和数学上发生了什么

计算科学 Python 计算物理学 麻木的 张量
2021-12-19 04:33:23

我遇到了一个np.tensordot使用过的程序,所以我尝试查找它,但我无法真正理解这个函数在做什么......

我对抽象背景下(即纯数学/物理)中的张量的理解相当有信心,但我并不真正理解这tensordot应该做什么。我也很熟悉np.einsum(我发现使用/理解要简单得多),我想我在某处读到可以使用 and 执行相同的操作tensordoteinsum这是真的吗?

举个具体的例子吧。取一组的 3-张量,即是组件(如果您熟悉物理学,可能想想MPS)。一个左归一化 MPS 将满足 B:={A[n]}(A[n])ijk

ik(A[k]ik)A[k]ik=id.

显然,计算此表达式的一种方法由以下代码给出:

np.tensordot(np.conjugate(B),B,axes=([0,1],[0,1]))

不幸的是,我不知道这里的轴规范是做什么的。我厌倦了寻找更简单的例子(见这里),但我真的不明白。

我认为看到以代码形式编写的一些更复杂的示例将极大地帮助我,即用tensordot,而且还有抽象张量系数乘积形式的数学版本。

1个回答

如果您熟悉einsum,也许这个解释可以做到:axes[0]axes[1]在 的参数中指定重复字母的位置einsum例如,

np.tensordot(a, b, axes=[(0,2),(3,1)])

对应于

np.einsum('ijkl,mkni', a, b)

事实上,'ijkl'[(0,2)] == 'ik' == 'mkni'[(3,1)]和所有其他字母都是不同的。