2016-02-14 19 views
6

Ci scusiamo per il titolo spiegato male. Sto provando a parallelizzare una parte del mio codice e sono rimasto bloccato su un prodotto punto. Sto cercando un modo efficace di fare ciò che il codice qui sotto fa, sono sicuro che ci sia una soluzione semplice algebra lineare, ma io sono molto bloccato:Numpy Dot Prodotto di due array 2-d in numpy per ottenere un array 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,:]])) 

risposta

6

Un modo potrebbe essere quello di utilizzare np.einsum, che permette di specificare cosa si vuole che accada agli indici:

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