私の最後の問題(Python tensor product)に関連する別の質問があります。そこで私は計算に間違いを見つけました。 np.tensordotを使って、私は以下の式を計算しています: < ..>平均を表示する必要があります。今、私は無視両方の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_j
とw_k
はj=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のサイズまで使用していたので、残念ながら今私の次の問題です。
ドゥ: 'mewp = EWP/lenは(EWP)'、その後、EWP 'の代わりに' mewp'を使用'同じコードで?あるいは単に最後の出力で 'serc /(len(ewp)** 4)'メソッドを使いますか? – Divakar
@Divakar:申し訳ありませんが、私はその点を見ませんか?私の問題は、異なる値だけが互いに独立していて、 ' = 'が真であるということです。 –
HighwayJohn