Python张量积

Python张量积,python,performance,numpy,numpy-einsum,Python,Performance,Numpy,Numpy Einsum,我有以下问题。出于性能原因,我使用了numpy.tensordot,因此我的值存储在张量和向量中。 我的一个计算如下: erc = numpy.tensordot(numpy.tensordot(re, ewp, axes=1), ewp, axes=1) 是w_j的期望值,是sigma_i的期望值。(也许我现在应该调用is sigma,因为它与标准偏差无关)现在为了进一步计算,我还需要方差。要获得方差,我需要计算: 现在,当我用numpy.tensordot将第一个公式实现到python

我有以下问题。出于性能原因,我使用了
numpy.tensordot
,因此我的值存储在张量和向量中。 我的一个计算如下:

erc = numpy.tensordot(numpy.tensordot(re, ewp, axes=1), ewp, axes=1)

w_j
的期望值,
sigma_i
的期望值。(也许我现在应该调用is sigma,因为它与标准偏差无关)现在为了进一步计算,我还需要方差。要获得方差,我需要计算:

现在,当我用
numpy.tensordot
将第一个公式实现到python中时,我真的很高兴它能工作,因为它非常抽象,我不习惯使用张量。代码确实如下所示:

erc = numpy.tensordot(numpy.tensordot(re, ewp, axes=1), ewp, axes=1)
现在这就行了,我的问题是写下第二个公式的正确形式。我的一次尝试是:

serc = numpy.tensordot(numpy.tensordot(numpy.tensordot(numpy.tensordot
(numpy.tensordot(re, re, axes=1), ewp, axes=1), ewp, axes=1)
, ewp, axes=1), ewp, axes=1)
但这确实给了我一个标量,而不是向量。另一种尝试是:

serc = numpy.einsum('m, m', numpy.einsum('lm, l -> m',
numpy.einsum('klm, k -> lm', numpy.einsum('jklm, j -> klm',
numpy.einsum('ijk, ilm -> jklm', re, re), ewp), ewp), ewp), ewp)
向量的长度为
l
,张量的维数为
l*l*l
。我希望我的问题是可以理解的,提前谢谢你


编辑:第一个公式也可以用python写下来,比如:
erc2=numpy.einsum('ik,k->i',numpy.einsum('ijk,k->ij',re,ewp),ewp)
你可以通过一系列的缩减来完成,就像这样-

p1 = np.tensordot(re,ewp,axes=(1,0))
p2 = np.tensordot(p1,ewp,axes=(1,0))
out = p2**2
解释

首先,我们可以将其分为两组操作:

Group 1: R(i,j,k) , < wj > , < wk > 
Group 2: R(i,l,m) , < wl > , < wl > 
因此,我们最终得到一个向量
p2
。与第二组类似,结果将是相同的向量。因此,为了得到最终的输出,我们只需要将该向量平方,即
p**2