小编jle*_*ewk的帖子

numpy.einsum 的惰性求值以避免在内存中存储中间大维数组

想象一下,我有整数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)

numpy lazy-evaluation multidimensional-array numpy-einsum

8
推荐指数
1
解决办法
125
查看次数