【发布时间】:2016-10-14 13:42:55
【问题描述】:
我有以下问题。出于性能原因,我使用numpy.tensordot,因此我的值存储在张量和向量中。
我的一个计算如下所示:
<w_j> 是w_j 的期望值,<sigma_i> 是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)
【问题讨论】:
标签: python performance numpy numpy-einsum