Trong toán học, tôi nghĩ dấu chấm trong numpy có ý nghĩa hơn
dấu chấm (a, b) _ {i, j, k, a, b, c} =
vì nó cho tích số chấm khi a và b là vectơ hoặc phép nhân ma trận khi a và b là ma trận
Đối với hoạt động matmul trong numpy, nó bao gồm các phần của kết quả chấm và nó có thể được định nghĩa là
> matmul (a, b) _ {i, j, k, c} =
Vì vậy, bạn có thể thấy rằng matmul (a, b) trả về một mảng có hình dạng nhỏ, có mức tiêu thụ bộ nhớ nhỏ hơn và có ý nghĩa hơn trong các ứng dụng. Đặc biệt, kết hợp với phát sóng , bạn có thể nhận được
matmul (a, b) _ {i, j, k, l} =
ví dụ.
Từ hai định nghĩa trên, bạn có thể thấy các yêu cầu để sử dụng hai thao tác đó. Giả sử a.shape = (s1, s2, s3, s4) và b.shape = (t1, t2, t3, t4)
Để sử dụng dấu chấm (a, b) bạn cần
- t3 = s4 ;
Để sử dụng matmul (a, b) bạn cần
- t3 = s4
- t2 = s2 , hoặc một trong t2 và s2 là 1
- t1 = s1 , hoặc một trong t1 và s1 là 1
Sử dụng đoạn mã sau để thuyết phục bản thân.
Mẫu mã
import numpy as np
for it in xrange(10000):
a = np.random.rand(5,6,2,4)
b = np.random.rand(6,4,3)
c = np.matmul(a,b)
d = np.dot(a,b)
#print 'c shape: ', c.shape,'d shape:', d.shape
for i in range(5):
for j in range(6):
for k in range(2):
for l in range(3):
if not c[i,j,k,l] == d[i,j,k,j,l]:
print it,i,j,k,l,c[i,j,k,l]==d[i,j,k,j,l] #you will not see them