我想评估
E = np.einsum('ij,jk,kl->ijkl',A,A,A)
F = np.einsum('ijki->ijk',E)
其中A是矩阵(大小不超过1000×1000)。计算E很慢。我想通过计算"对角线"来加快速度。我存储在F中的元素。是否可以组合这两个表达式?/有没有更好的方法来加速这个计算?
答案 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案件中。