我正试图在下面名为N x N
的p
数组上对以下三重乘积操作进行矢量化:
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/