2016-10-15 14 views
1

私の最後の問題(Python tensor product)に関連する別の質問があります。そこで私は計算に間違いを見つけました。 np.tensordotを使って、私は以下の式を計算しています: enter image description here < ..>平均を表示する必要があります。今、私は無視両方のpythonコードで、あらゆる可能性を掛けていることを平均テンソル積

q1 = numpy.tensordot(re, ewp, axes=(1, 0)) 
q2 = numpy.tensordot(q1, ewp, axes=(1, 0)) 
serc = q2 ** 2 

または

serc = numpy.einsum('im, m -> i', numpy.einsum('ilm, l -> im', 
numpy.einsum('iklm, k -> ilm', numpy.einsum('ijklm, j -> iklm', 
numpy.einsum('ijk, ilm -> ijklm', re, re), ewp), ewp), ewp), ewp) 

:Pythonコードでは、それがこの(EWPがベクトルとテンソルを再)のように見えるん 。もちろんw_jw_kj=kとは独立していません。その場合、jとkだけが同じであることは< w_j*w_j*w_l*w_m> = <w_j>*<w_l>*<w_m>となります。 j=k=lについては、< w_j*w_j*w_j*w_m> = <w_j>*<w_m>となります。 j=k=l=mについて:< w_j*w_j*w_j*w_j> = <w_j>。すべての変数が異なる場合にのみ、独立性が成立し、< w_i*w_j*w_l*w_m> = <w_i>*<w_j>*<w_l>*<w_m>が得られます。これがすべての可能性に対してコードが行うことです。これが私の問題を理解してくれることを願っています。今私の質問は私のコードでこれを表現することができますか?

編集:私が持っているアイデアは、まず4dimを作成することです。 <w_j w_k w_l w_m>を表しテンソル:

wtensor = numpy.einsum('jkl, m -> jklm', numpy.einsum('jk, l -> jkl', 
numpy.einsum('j, k -> jk', ewp, ewp), ewp), ewp) 

は、その後、私はidependentない値を変更する必要があります。彼らは対角線上にいるはずだと思いますか?しかし、私は本当にテンソル計算についてあまり知らないので、この時点で私は苦労しています。 ワットテンソルを操作した後、私は実行して結果を得るでしょう:

serc = numpy.einsum('ijklm, jklm -> i', numpy.einsum('ijk, ilm -> 
ijklm', re, re), wtensor) 

EDIT2は:別のポストでは、私はそれがここに収まらないように、私は4dimを操作する方法を正確に尋ねました。 Divakarはここで見ることができ、本当に素敵な解決策だった:これは最終的に私を与え

serc = numpy.einsum('ijklm, jklm -> i', numpy.einsum('ijk, ilm -> 
ijklm', re, re), wtensor) 

Fill a multidimensional array efficiently that have many if else statements

from itertools import product 

n_dims = 4 # Number of dims 
# Create 2D array of all possible combinations of X's as rows 
idx = np.sort(np.array(list(product(np.arange(gn), 
repeat=n_dims))),axis=1) 
# Get all X's indexed values from ewp array 
vals = ewp[idx] 
# Set the duplicates along each row as 1s. With the np.prod coming up 
next, 
#these 1s would not affect the result, which is the expected pattern 
here. 
vals[:,1:][idx[:,1:] == idx[:,:-1]] = 1 
# Perform product along each row and reshape into multi-dim array 
out = vals.prod(1).reshape([gn]*n_dims) 

を私はここに取得しています配列が、私は今、上記のコードで使用することができますwtensorです私が望んでいた結果と基本的にその質問に答えます。 1つの問題があります。 ewpの長さは、テンソルの大きさも定義しなければなりません。そうでなければ、コードは多くのメモリを使います。私の意図は8のサイズまで使用していたので、残念ながら今私の次の問題です。

+0

ドゥ: 'mewp = EWP/lenは(EWP)'、その後、EWP 'の代わりに' mewp'を使用'同じコードで?あるいは単に最後の出力で 'serc /(len(ewp)** 4)'メソッドを使いますか? – Divakar

+0

@Divakar:申し訳ありませんが、私はその点を見ませんか?私の問題は、異なる値だけが互いに独立していて、 ' = 'が真であるということです。 – HighwayJohn

答えて

1

さてあなたがそうのように、np.tensordotnp.einsumの組み合わせで効率的にそれを行うことができます -

serc = np.einsum('ilm,ilm->i',re,np.tensordot(re,wtensor,axes=[(1,2),(0,1)])) 
+0

これは本当にそれをスピードアップ:)しかし、1つの質問? tensordotコマンドの軸はnp.einsumにどのように関連していますか?私はtensordotのマニュアルを読んでいますが、私は軸を想像する方法と正しいものを決める方法について少し困惑しています – HighwayJohn

+0

@HighwayJohnまあ、私は 'einsum'解決法を見ずに方程式を念頭に置いて進めました。私はあなたにその角度を与えてみましょう:最初の減少グループは 'R(i、j、k)'と 'w(j、k、l、m)'の間にあり、そこでの削減。最初の総和はRの2番目の軸を 'w'の最初のものとするため、axes = [(1、...)、(0、....)]となります。同様に、Rの3番目の軸とwの2番目の軸との間に、したがって、axes = [(...、2)、(....、1)]。お役に立てれば! – Divakar

+0

ああ大丈夫だよ!ありがとう:) – HighwayJohn