2017-10-29 19 views
1

私はnumpyの行列乗算行単位

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

のように、1つの行列を持っていると私は各要素は、それ自体での行の行列積である新しい行列を取得したい:

np.array([ 
    np.dot(np.array([a[0]]).T, np.array([a[0]])), 
    np.dot(np.array([a[1]]).T, np.array([a[1]])), 
    np.dot(np.array([a[2]]).T, np.array([a[2]])), 
    np.dot(np.array([a[3]]).T, np.array([a[3]])), 
]) 

は、各要素が3x3の行列である4x4行列になります。 この後、0軸を合計して新しい3x3行列を得ることができます。

ループを使用する以外はこれを実装する上手な方法はありますか?整列した第1の軸を保つ2つ目の間の外積を実行するための

答えて

2

使用NumPy broadcasting - 私は何かが欠けていないが、可能性があります

np.einsum('ij,ik->ijk',a,a) 
+0

私の削除された回答が表示されたら、私は途中でした!次回は、私はそれを正しく、お返事いただきありがとうございます。 :) –

+1

@cᴏʟᴅsᴘᴇᴇᴅうん、あなたは近くにいた! :) – Divakar

+0

ありがとう!私は試しましたが、これは私が望むものです。このようにして放送はできないと想像してはいけません。 – JQK

0

- np.einsum

a[:,:,None]*a[:,None,:] # or a[...,None]*a[:,None] 

は、に変換しますこれだけの行列乗算?

>>> a.T @ a 
array([[30, 40, 50], 
     [40, 54, 68], 
     [50, 68, 86]]) 

>>> np.sum(np.array([ 
     np.dot(np.array([a[0]]).T, np.array([a[0]])), 
     np.dot(np.array([a[1]]).T, np.array([a[1]])), 
     np.dot(np.array([a[2]]).T, np.array([a[2]])), 
     np.dot(np.array([a[3]]).T, np.array([a[3]])), 
    ]), axis=0) 
array([[30, 40, 50], 
     [40, 54, 68], 
     [50, 68, 86]]) 
+0

こんにちはpercusse、あなたのコメントのおかげで、いいえ、彼らは同じではありません。私は[1、2、3] .T * [1,2,3] = [[1,2,3]、[2,4,6]、[3,6,9]]のようなものを計算していますが、あなたが計算しているのは[1,2,3] * [1,2,3] .T = [14]です。 – JQK

+0

@JQKあなたのコードをコピーして、結果を比較しました。 – percusse

+0

はい、あなたは正しいようですが、私はまだそれをチェックする時間がありません..あなたの助けをありがとう。 – JQK