2017-06-17 13 views
0

私はnumpyでテンソルAを持っています。これはN1 x .. x Nn x M1 x ... x Mmであり、テンソルBM1 x ... x Mmです。どのように私はN1 x ... x Nn?あるべきテンソル収縮ABCを、計算しない私はnumpyでこのテンソルの収縮を計算する方法は?

np.tensordot(A, B, ...) 

の様々な順列をやってみましたしかし、私はそれで本当に慣れていませんよ。例えば

AN x M行列とBM - ベクトルだった場合、私はちょうどnp.dot(A, B)を行うことができますが、私はこれを一般化するかどうかはわかりません。

+0

柔軟性とパワーを最大限に引き出すには、['numpy.einsum'](https://docs.scipy.org/doc/numpy/reference/)を試してみてください。 generated/numpy.einsum.html)。 – Evert

答えて

1
In [78]: A=np.arange(2*3*4*5).reshape(2,3,4,5) 
In [79]: B=np.arange(4*5).reshape(4,5) 

In [81]: np.einsum('...ij,ij',A,B) 
Out[81]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

In [82]: np.tensordot(A,B,((2,3),(0,1))) 
Out[82]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

tensordotdotが処理できる2dに問題を低減するために変形(及び軸スワップ)を使用:全体寸法場合

In [83]: A1=A.reshape(2*3,4*5) 
In [84]: B1=B.reshape(4*5) 
In [85]: C1=np.dot(A1,B1) 
In [86]: C1.reshape(2,3) 
Out[86]: 
array([[ 2470, 6270, 10070], 
     [13870, 17670, 21470]]) 

、ひいてはアレイのサイズが大きすぎると、einsumは、メモリの問題を有することになります。まあ、どちらもできます。

...は、可変数Nの数値を処理できますが、Mのディメンションについて具体的に示す必要があります。 (理論的には、プログラムでijの文字列を構築することができます)

+0

テンソルの収縮を変形して行列乗算に変換できることは、どのようにしてわかりましたか?私は答えを見つけるのに困っている。 – michaelsnowden

+0

「テンソルの収縮」はこれについてnumpyで一般的な説明ではありません。したがって、ウェブ検索は役に立たないでしょう。私はあなたの例と次元から仕事をし、「エインサム」を経験しました。 – hpaulj

関連する問題