2016-02-14 1 views
6

Désolé pour le titre mal expliqué. J'essaie de paralléliser une partie de mon code et je me suis coincé sur un produit scalaire. Je cherche un moyen efficace de faire ce que le code ne ci-dessous, je suis sûr qu'il ya une solution simple d'algèbre linéaire mais je suis très coincé:Numpy Dot Produit de deux tableaux 2-D en numpy pour obtenir un tableau 3-D

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,:]])) 

Répondre

6

Une façon serait d'utiliser np.einsum, qui permet vous de spécifier ce que vous voulez arriver aux indices:

>>> 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