Python 二维阵列上的矢量化NumPy三重积
我正在尝试对下面名为Python 二维阵列上的矢量化NumPy三重积,python,arrays,numpy,vectorization,numpy-einsum,Python,Arrays,Numpy,Vectorization,Numpy Einsum,我正在尝试对下面名为p的nxn数组上的以下三重乘积操作进行矢量化: 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应该在这里有用,尽管我并没有对重复的索引进行求和,但我无法确定它。
p
的nxn
数组上的以下三重乘积操作进行矢量化:
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
应该在这里有用,尽管我并没有对重复的索引进行求和,但我无法确定它。想法?只要将这些循环迭代器作为字符串符号进行移植,我们就会有这样一个基于循环迭代器的解决方案-
h = np.einsum('jk,kl,lj->jkl',p,p,p) - np.einsum('jl,lk,kj->jkl',p,p,p)
h = p[...,None]*p*p[:,None,:].T - p[:,None,:]*p.T*p.T[...,None]
基本上是一个与扩展相关的问题(因为我们没有减少任何轴),我们也可以通过在不同的地方引入带有None/np.newaxis
的新轴来使用,以允许扩展,如下所示-
h = np.einsum('jk,kl,lj->jkl',p,p,p) - np.einsum('jl,lk,kj->jkl',p,p,p)
h = p[...,None]*p*p[:,None,:].T - p[:,None,:]*p.T*p.T[...,None]