2016-10-14 75 views
3

我有以下問題。出於性能的原因,我使用numpy.tensordot,因此我的值存儲在張量和向量中。 我的計算的一個是這樣的:Python張量積

enter image description here

<w_j>w_j<sigma_i>sigma_i預期值的預期值。 (也許我現在應該叫做西格瑪,因爲它與標準偏差無關)現在爲了進一步計算,我還需要方差。到Get方差我需要計算: enter image description here

現在,當我實現了第一個公式爲蟒蛇與numpy.tensordot我真的很高興,它的工作,因爲這是比較抽象的,我不習慣張量。該代碼看起來是這樣的:

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) 

的載體已lenght l和張量的尺寸爲l * l * l。我希望我的問題是可以理解的,並且提前謝謝你!

編輯:第一個公式可以在Python也寫下來,如:erc2 = numpy.einsum('ik, k -> i', numpy.einsum('ijk, k -> ij', re, ewp), ewp)

回答

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),< wj>,< wk並用(i)最終,我們需要與w沿着R的第二和第三軸進行逐元素乘法,然後執行沿着這些軸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

+0

非常感謝!你的答案正在工作:) – HighwayJohn