2016-07-18 65 views
2

我想向量化的N x N阵列以下三重积操作如下称为p矢量化NumPy的三重积

for j in range(len(p)): 
    for k in range(len(p)): 
     for l in range(len(p)): 
      h[j, k, l] = p[j, k] * p[k, l] * p[l, j] - p[j, l] * p[l, k] * p[k, j] 

我想numpy.einsum应该使用在这里,尽管我不是实际上总结了重复的指标,但我一直无法将其归结。思考?

回答

4

简单地移植在这些循环迭代器作为串符号,我们将有像这样的einsum基础的解决方案 -

h = np.einsum('jk,kl,lj->jkl',p,p,p) - np.einsum('jl,lk,kj->jkl',p,p,p) 

作为基本的扩展相关的问题(因为我们没有减少任何轴),我们可以简单使用NumPy broadcasting也通过引入在不同的地方有None/np.newaxis新的坐标轴,以允许扩展,像这样 -

h = p[...,None]*p*p[:,None,:].T - p[:,None,:]*p.T*p.T[...,None] 
+0

好了,现在我觉得挺傻的。 – NPMitchell