2017-01-26 27 views
5

Cho phép nói rằng tôi có ma trận A (KxMxN) và B (KxLxN), trong đó L, M, N nhỏ và K là một số lớn. Tôi muốn tính toán sản phẩm bên ngoài của việc sử dụng 2 kích thước cuối cùng dọc theo chiều thứ nhất để lấy ma trận C (KxMxL).Làm thế nào để tính toán hiệu quả các sản phẩm bên ngoài của hai loạt ma trận trong numpy?

tôi có thể làm điều này bằng cách chạy một vòng lặp for cho mỗi chỉ số k trong "K" và sử dụng chức năng matmul NumPy cho 2D ma trận

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

Tôi tự hỏi nếu tôi có thể làm điều đó mà không có sự cho vòng/hiểu như K là một số rất lớn.

+0

Nó thực sự là một sản phẩm bên trong - trên một tập hợp các subarrays. Sản phẩm bên ngoài tăng kích thước và không tính tổng. – hpaulj

Trả lời

5

Kể từ A có hình (K, M, N)B có hình (K, L, N), và bạn muốn tìm tổng của các sản phẩm có hình dạng (K, M, L), bạn có thể sử dụng np.einsum:

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

matmul công trình, với một transpose trong B, vì vậy từ thứ 2 đến cuối cùng mờ khớp với số cuối cùng của số 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 

Ví dụ nhỏ này là timeit giống nhau.

[np.dot(x,y.T) for x, y in zip(A, B)] thực hiện tương tự; phù hợp với mờ cuối cùng thứ 2 của y với số của x và lặp lại vào mờ thứ nhất của AB.

Các vấn đề liên quan