1

次の 3 次テンソルがあります。両方のテンソルは、100 個の 10x9 行列を含む最初のテンソルと 100 個の 3x10 行列を含む 2 番目のテンソルを行列化します (この例では 1 つだけ入力しました)。

私の目的は、行列を 1 対 1 の対応として並べて乗算することです。これにより、形状のあるテンソルが得られます。 (100, 3, 9)これは、両方のテンソルを圧縮してからそれぞれのドットを取る for ループで実行できますが、私は探していますnumpy 演算子だけでこれを行うには。これまでのところ、失敗した試みがいくつかあります

試行 1:

import numpy as np
T1 = np.ones((100, 10, 9))
T2 = np.ones((100, 3, 10))
print T2.dot(T1).shape

試行 1 の出力:

(100、3、100、9)

つまり、考えられるすべての組み合わせを試したということです...これは私が求めているものではありません。

実際には、他の試みはコンパイルさえしません。np.tensordot 、 np.einsum を使用してみました(ここでhttps://jameshensman.wordpress.com/2010/06/14/multiple-matrix-multiplication-in-numpyを読んでくださいアインシュタインのインデックスを正しく取得してください)また、同じリンクに、私が視覚化できなかったクレイジーなテンソルキューブの再形成方法があります。これに取り組む方法についての提案/アイデアの説明はありますか?

4

1 に答える 1

1

試しましたか?

In [96]: np.einsum('ijk,ilj->ilk',T1,T2).shape
Out[96]: (100, 3, 9)

私がこれを理解する方法は、形状を見ることです:

(100, 10, 9))  (i, j, k)
(100, 3, 10)   (i, l, j)
-------------
(100, 3, 9)    (i, l, k)

2 つのj合計と相殺します。その他は出力にキャリーします。


4次元配列の場合、次のような次元 (100,3,2,24 )でいくつかのオプションがあります:

3DT1.reshape(300,2,24)にリシェイプし、リシェイプしてから に戻しR.reshape(100,3,...)ます。Reshape は実質的にコストがかからず、優れたnumpyツールです。

einsum: np.einsum('hijk,hilj->hilk',T1,T2)にインデックスを追加しますi

または省略記号を使用します: np.einsum('...jk,...lj->...lk',T1,T2). この式は、3D、4D、およびそれ以上で機能します。

于 2015-12-30T02:11:17.123 に答える