2017-01-10 23 views
2

numpyでは、N個の3×3行列の配列があります。これは私が(私は内容を抽象化しています)それらを格納しています方法の例のようになります。複数の行列乗算

N = 10 
matrices = np.ones((N, 3, 3)) 

私も3 - ベクトルの配列を持っている、これは、例えば次のようになります。

vectors = np.ones((N, 3)) 

私はこのような何かを達成するように、numpyのを経由してそれらを乗算する方法を見つけ出すように見えることはできません。result_vectorの形状と

result_vectors = [] 
for matrix, vector in zip(matrices, vectors): 
    result_vectors.append(matrix @ vector) 

(N, 3)である(配列にキャストすることにより)。 しかし、リストの実装はスピードのために問題にはなりません。

私はさまざまな転置でnp.dotを試しましたが、最終的な結果は正しい形になりませんでした。

答えて

1

使用np.einsum -

np.einsum('ijk,ik->ij',matrices,vectors) 

ステップ:

1)整列した第1の軸にしてください。

2)入力配列の最後の軸を互いに合計して減らします。

3)残りの軸(第2軸からmatricesまで)を要素ごとに掛け合わせます。

+0

'matmul'のように見えるのは、次元マッサージのビットで使うことができます:'(matrices @ vectors [:、:、None])。squeeze() ' – hpaulj