【发布时间】:2022-08-18 16:22:07
【问题描述】:
我正在使用 numpy(理想情况下是 Numba)来执行涉及三个张量的张量收缩,其中一个是一个向量,应该只乘以其他索引的一个索引。例如,
A = np.random.normal(size=(20,20,20,20))
B = np.random.normal(size=(20,20,20,20))
v = np.sqrt(np.arange(20))
# e.g. v on the 3rd index
>>> %timeit np.vdot(A * v[None, None, :, None], B)
125 µs ± 5.14 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
与之比较
C = np.random.normal(size=(20,20,20,20))
>>> %timeit np.vdot(A * C, B)
76.8 µs ± 4.25 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
有没有更有效的方法将产品包含在v 中?感觉它应该比乘以完整张量C 慢。
-
np.einsum(\'ijkl,k,ijkl\', A, v, B, optimize=\'optimal\').item(),我不知道,为什么结果是一个优化的单项数组。 -
我应该说我想避免使用
einsum,因为 numba 不支持它。是否可以做与 einsum 相同的操作,但没有 einsum? -
也许从这篇文章stackoverflow.com/questions/48253210/… 可以理解为什么第一种情况比第二种慢