2010-12-20 18 views
13

Mam matrycę P o kształcie MxN i tensor 3d T o kształcie KxNxR. Chcę pomnożyć P z każdą macierzą NxR w T, otrzymując w ten sposób tensor 3D o wartości KxMxR.Numpy: pomnożenie macierzy za pomocą tensora 3d - sugestia

P.dot(T).transpose(1,0,2) daje oczekiwany wynik. Czy istnieje rozwiązanie ładniejszego (tj. Pozbycie się transpose) tego problemu? To musi być dość powszechna operacja, więc zakładam, że inni znaleźli różne podejścia, np. używając tensordot (którego próbowałem, ale nie udało mi się uzyskać pożądanego rezultatu). Opinie/widoki byłyby wysoko cenione!

Odpowiedz

6
scipy.tensordot(P, T, axes=[1,1]).swapaxes(0,1) 
+1

Ha! Wpatrywałem się w wynik 'scipy.tensordot (P, T, axes = [1,1])' godzinami wczoraj, rozpaczając nad wymienianymi wymiarami. Nie wiedziałem o 'swapaxes', dzięki! – osdf

+0

Nie ma za co. Sprawdziłem również, czy zamiana osi daje prawidłową odpowiedź numeryczną i tak się dzieje. –

2

Można również użyć notacji sumowania Einstein:

P = numpy.random.randint(1,10,(5,3)) 
P.shape 
T = numpy.random.randint(1,10,(2,3,4)) 
T.shape 

numpy.einsum('ij,kjl->kil',P,T) 

który powinien dać takie same wyniki jak:

P.dot(T).transpose(1,0,2)