【发布时间】:2014-11-27 02:42:46
【问题描述】:
我得到了一些使用 einsum 函数的工作代码。但是因为 einsum 目前对我来说仍然像black voodoo。我想知道,这段代码实际上在做什么,是否可以使用np.dot 进行优化
我的数据看起来像这样
n, p, q = 40000, 8, 4
a = np.random.rand(n, p, q)
b = np.random.rand(n, p)
而我现有的函数 einsum 函数看起来像这样
f1 = np.einsum("ijx,ijy->ixy", a, a)
f2 = np.einsum("ijx,ij->ix", a, b)
但它的真正作用是什么?我到了这里:每个维度(轴)都由一个标签表示,i 等于第一个轴n,j 第二个轴p 和x 和y 是不同的标签对于同一轴q。
所以f1的输出数组的顺序是ixy,因此输出形状是40000,4,4 (n,q,q)
但这就是我所知道的。还有
【问题讨论】:
-
关于Einstein notation 的维基百科文章应该可以帮助您了解
einsum的作用! -
@Phillip 感谢您的链接!那肯定有帮助。但也让我更加意识到我无法自己优化它,因为这超出了我的想象。
-
通常
einsum和dot一样好。两者都被编译。dot只是为特定的维度组合提供了更严格的代码。