2017-06-27 7 views
0

私は同僚にnp.einsumを教えようとしていましたが、どのように乗算と合計に還元されるのかを期待していました。 数値データではなく、アルファベット文字を使用すると考えました。配列内にある。np.einsum評価グラフを生成する

[['a'、 'b']、['c'、d ']]とB(2X1)をA [2] ']] einsumを使って行列Cを作ることができます。例えば、np.einsum('ab , bc -> ac', A, B)のようにします。

私が見てみたいことはある:それは計算グラフを返す:何かのように:*のC + ...など

勿論、np.einsumは、数値データを期待して与えられた場合はエラーを与えるだろう実行するコードの上に。

答えて

1

tensordotには、'a'*3 => 'aaa'という事実を利用して、配列の1つに文字列を使用した例があります。しかしeinsumは文字列では何もできません(コンパイルされたコードの問題です)。

いつか私は純粋なpythonの仕事を書いて、 'ij、jk->'という文字列を解析し、適切なsum-of-productの計算を設定します。これには余分なデバッグ出力が含まれます。それはあなたの仕事の出発点になるかもしれません。

https://github.com/hpaulj/numpy-einsum

最新einsumは、一部のデバッグ助けを借りて、いくつかの最適化を行います。その詳細についてはnp.einsum_pathを参照してください。

Understanding NumPy's einsum

https://en.wikipedia.org/wiki/Einstein_notation

0

まず、なぜあなたはBは2次元のする必要がありますか?なぜnp.einsum('ab , b -> a', A, B)だけではないのですか?

今実際の質問: それはあなたが欲しいものではありませんが、AとBのスマートな選択肢を使用することで、これを見ることができます。例えばA = [[1,10],[100,1000]]B = [1,2]です。これはnp.einsum('ab , b -> a', A, B) = [21,2100]となり、何が起こったのかははっきりしています。

もっと一般的なバージョンは少し複雑です(しかし、うまくいけば必要ありません)。考えは素数の異なる効用を使用することです(特に便利なのは2と5です。あなたは2つ以上の次元を合計したい場合、素数(2,3,5,7など)を取って、その結果を別の数体系に変換することを検討するかもしれません。 2つのdims-> 30-aryシステムの上にある場合 3 dims(2,3,5,7) - > 210-aryシステム

関連する問題