【问题标题】:Python tensor productPython张量积
【发布时间】: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


    【解决方案1】:

    你可以通过一系列减少来做到这一点,就像这样 -

    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) 、 wj >、 wk 并最终得到 (i) ,我们需要沿 R 的第二和第三轴与 @987654328 执行逐元素乘法@ 然后沿这些轴执行sum-reduction。在这里,我们分两步使用两个tensordots -

    [1] R(i,j,k) , < wj > to get p1(i,k)
    [2] p1(i,k) , < wk > to get p2(i)
    

    因此,我们最终得到了一个向量p2。与第二组类似,结果将是相同的向量。因此,要获得最终输出,我们只需对该向量求平方,即p**2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 2018-03-14
      • 2019-01-07
      • 1970-01-01
      • 2019-06-24
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多