2017-01-26 15 views
5

Powiedzmy, że mam macierze A (KxMxN) i B (KxLxN), gdzie L, M, N są małe, a K to duża liczba. Chciałbym obliczyć zewnętrzny produkt użycia dwóch ostatnich wymiarów wzdłuż pierwszego wymiaru, aby uzyskać macierz C (KxMxL).Jak skutecznie obliczyć zewnętrzny produkt z dwóch serii macierzy w numpy?

mogę to zrobić poprzez uruchomienie pętli for dla każdego indeksu k w "K" i używać matmul funkcję NumPy dla 2D macierzy

out = [np.matmul(x,y.T) for x, y in zip(A, B)] 
out=np.asarray(out) 

Zastanawiam się, czy mogę to zrobić bez pętli for/zrozumienie jako K jest bardzo dużą liczbą.

+0

To naprawdę produkt wewnętrzny - nad zestawem podbarw. Produkt zewnętrzny zwiększa wymiary i nie sumuje żadnych. – hpaulj

Odpowiedz

5

Od A ma kształt (K, M, N) i B ma kształt (K, L, N) i chcesz znaleźć sumę produktów z kształtu (K, M, L), można użyć np.einsum:

C = np.einsum('kmn,kln->kml', A, B) 
0

matmul prace, z transpozycji B, więc jego druga do ostatniej ciemności pasuje do ostatniej z A.

In [1019]: A=np.random.rand(K,M,N) 
In [1021]: B=np.random.rand(K,L,N) 

In [1023]: C=np.einsum('kmn,kln->kml',A,B) 
In [1024]: C.shape 
Out[1024]: (2, 4, 3) 

In [1026]: [email protected](0,2,1) 
In [1027]: D.shape 
Out[1027]: (2, 4, 3) 

In [1028]: np.allclose(C,D) 
Out[1028]: True 

Na tym małym przykład timeit jest taka sama.

[np.dot(x,y.T) for x, y in zip(A, B)] robi to samo; dopasować drugi ostatni raz wartość y z wartością x i powtórzyć po pierwszym przyciemnieniu A i B.

Powiązane problemy