想象一下,我有整数n,q和具有以下维度的向量/数组:
import numpy as np
n = 100
q = 102
A = np.random.normal(size=(n,n))
B = np.random.normal(size=(q, ))
C = np.einsum("i, jk -> ijk", B, A)
D = np.einsum('ijk, ikj -> k', C, C)
Run Code Online (Sandbox Code Playgroud)
如果所有中间数组都适合内存,则工作正常。
现在假设我可以存储 size 的内存数组(n,n),(q,n)但不能存储任何三维数组,例如 shape (n,n,q)。我无法存储在C上面的内存数组中。相反,要计算D,
D1 = np.einsum('i, jk, i, kj -> k', B, A, B, A, optimize='optimal')
Run Code Online (Sandbox Code Playgroud)
工作正常,np.einsum通常足够聪明,可以找到一个einsum_path3d 数组。伟大的!
现在让我们稍微复杂一点:
C = np.einsum("i, jk -> ijk", B, A) # …Run Code Online (Sandbox Code Playgroud)