2016-02-14 8 views
6

Entschuldigung für den schlecht erklärten Titel. Ich versuche, einen Teil meines Codes zu parallelisieren und blieb bei einem Punktprodukt hängen. Ich bin auf der Suche nach einer effizienten Art und Weise zu tun, was der Code unten ist, ich bin sicher, dass es eine einfache lineare Algebra-Lösung ist, aber ich bin sehr fest:Numpy Dot Produkt von zwei 2-d-Arrays in numpy, um 3-d-Array zu erhalten

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

Antwort

6

Eine Möglichkeit np.einsum, wäre die Verwendung welche erlaubt Sie angeben, was Sie zu den Indizes passieren soll:

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

Hier ist eine andere Art und Weise mit broadcasting -

(puy[None,...]*puy2[:,None,:]).T