2016-05-24 10 views
0

N×2アレイに2×Nアレイを乗算(行列乗算)したい。N 2×2アレイに2×nアレイを乗算するためのnumpyドットまたはエインサム

n = np.array([1,2,3]) 
m = np.array([[n,0*n],[0*n,0*n+1]]).T 
# shape: (3, 2, 2) 
# [[[1 0] 
# [0 1]] 

# [[2 0] 
# [0 1]] 

# [[3 0] 
# [0 1]]] 

x = np.array([[1,2,3],[4,5,6]]) 
# shape: (2, 3) 
# [[1 2 3] 
# [4 5 6]] 

だから、結果は

[[1 4 9] 
[4 5 6]] 

する必要がありますこれはeinsumやドットで可能なはずですが、私は両方で失敗しました。私が読んだことから、ドットを使った解決策は潜在的に速くなるでしょう。

edit:もう少し文脈を与える:これは2xnベクトル上の実際の(2x2)行列乗算です。しかし、n個の異なる行列が存在する:n個のベクトル要素のそれぞれに1つ。

答えて

2

あなたは、以下のようにnp.einsumを使用することができる:einsum

import numpy as np 

n = np.array([1,2,3]) 
m = np.array([[n,0*n],[0*n,0*n+1]]).T 

x = np.array([[1,2,3],[4,5,6]]) 

result = np.einsum('nij, jn->in', m, x) 

nijは、2x2の行列と2次元アレイ間の和のインデックスであり、三次元にある指標であります。

resultは次のとおりです。

array([[1, 4, 9], 
     [4, 5, 6]]) 
+0

これが正しい 'のようなもの' です。正しい結果は、少なくともその中に埋もれています。しかし、あなたはそれを引き出す必要があります。これは、必要以上に多くの乗算を行います。編集:期待される出力は質問にあります – Basti

+0

あなたは期待される出力を書くことができますか? –

+0

これは「結果が「 – Basti

関連する問題