结合Einsum表达式

时间:2016-04-27 02:40:08

标签: python numpy linear-algebra

我想评估

E = np.einsum('ij,jk,kl->ijkl',A,A,A)
F = np.einsum('ijki->ijk',E)

其中A是矩阵(大小不超过1000×1000)。计算E很慢。我想通过计算"对角线"来加快速度。我存储在F中的元素。是否可以组合这两个表达式?/有没有更好的方法来加速这个计算?

2 个答案:

答案 0 :(得分:2)

我不确定是否有自动方式,但您可以自己做数学并给einsum最终表达式:

F = np.einsum('ij,jk,ki->ijk', A, A, A)

答案 1 :(得分:1)

In [86]: A=np.random.randint(0,100,(100,100))

In [88]: E1=np.einsum('ijki->ijk',np.einsum('ij,jk,kl->ijkl',A,A,A))

In [89]: E2=np.einsum('ij,jk,ki->ijk',A,A,A)

In [90]: np.allclose(E1,E2)
Out[90]: True

良好的时间改进 - 100x,对应于已保存的尺寸(l

In [91]: timeit np.einsum('ijki->ijk',np.einsum('ij,jk,kl->ijkl',A,A,A))
1 loops, best of 3: 1.1 s per loop

In [92]: timeit np.einsum('ij,jk,ki->ijk',A,A,A)
100 loops, best of 3: 10.9 ms per loop

einsum对所有索引执行组合迭代,尽管是在Cython代码中。因此,减少索引数量可以节省大量时间。看起来像i...i组合在初始计算中起作用。

只有2g内存,(1000,1000)太大,迭代器太大'在E1情况下,“内存错误”#39;在E2案件中。