我正试图在下面名为N x Np数组上对以下三重乘积操作进行矢量化:

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在这里应该有用,尽管我实际上并没有对重复的指数求和,但我还没能确定它。思想?

最佳答案

只需将循环迭代器作为字符串符号移植到这些循环迭代器上,我们就可以得到这样一个基于einsum的解决方案-

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

基本上是一个与扩展有关的问题(因为我们不减少任何轴),我们也可以简单地使用NumPy broadcasting,通过在不同的地方引入新的轴,以允许扩展,例如
h = p[...,None]*p*p[:,None,:].T - p[:,None,:]*p.T*p.T[...,None]

关于python - 在2D数组上向量化NumPy三元积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38427615/

10-12 22:26