2016-02-14 10 views
6

ひどく説明されたタイトルは申し訳ありません。私はコードの一部を並列化しようとしており、ドットプロダクトにはまっていません。私は以下のコードが何やっての効率的な方法を探しています、私は単純な線形代数のソリューションがあると確信しているが、私は非常にこだわっている:ことができますnp.einsumを使用することですナンシードット3次元配列を得るnumpyの2次元配列の2つの製品

puy = np.arange(8).reshape(2,4) 
puy2 = np.arange(12).reshape(3,4) 

print puy, '\n' 
print puy2.T 

zz = np.zeros([4,2,3]) 

for i in range(4): 
    zz[i,:,:] = np.dot(np.array([puy[:,i]]).T, 
       np.array([puy2.T[i,:]])) 

答えて

6

一つの方法、あなたがインデックスに起こるしたいものを指定します

>>> np.einsum('ik,jk->kij', puy, puy2) 
array([[[ 0, 0, 0], 
     [ 0, 16, 32]], 

     [[ 1, 5, 9], 
     [ 5, 25, 45]], 

     [[ 4, 12, 20], 
     [12, 36, 60]], 

     [[ 9, 21, 33], 
     [21, 49, 77]]]) 
>>> np.allclose(np.einsum('ik,jk->kij', puy, puy2), zz) 
True