Python张量产品

时间:2016-10-14 13:42:56

标签: python performance numpy numpy-einsum

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

enter image description here

<w_j>是预期值w_j<sigma_i>预期值sigma_i。 (也许我现在应该称之为sigma,因为它与标准偏差无关)现在进行进一步的计算我也需要方差。要得到方差,我需要计算: enter image description here

现在当我用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)

1 个答案:

答案 0 :(得分:2)

你可以通过一系列缩减来做到这一点,如此 -

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 > 

在这两组中执行的操作是相同的。因此,可以计算一个组并根据它得出最终输出。

现在,要计算R(i,j,k),&lt; wj&gt;,&lt; wk并以(i)结尾,我们需要沿R的{​​{1}}的第二和第三轴执行逐元素乘法,然后执行w那些轴。在这里,我们分两步执行两个sum-reduction -

tensordots

因此,我们最终得到了一个向量[1] R(i,j,k) , < wj > to get p1(i,k) [2] p1(i,k) , < wk > to get p2(i) 。与第二组类似,结果将是相同的向量。因此,为了得到最终输出,我们只需要对该矢量求平方,即p2