2016-02-14 29 views
6

Przepraszamy za źle wyjaśniony tytuł. Próbuję paralelizować część mojego kodu i utknąłem na produkcie dot. Szukam skuteczny sposób robienia tego, co poniżej kod nie, jestem pewien, że jest to proste rozwiązanie, algebra liniowa, ale jestem bardzo zakleszczony:Numpy Dot Produkt z dwóch 2-d tablic w numpy, aby uzyskać 3-d tablicy

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

Odpowiedz

6

Jednym ze sposobów byłoby użyć np.einsum, który pozwala określić, co chcesz się z indeksów:

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