W matematyce myślę, że kropka w numpy ma większy sens
kropka (a, b) _ {i, j, k, a, b, c} =
ponieważ daje iloczyn skalarny, gdy a i b są wektorami, lub mnożenie macierzy, gdy a i b są macierzami
Jeśli chodzi o operację matmul w numpy, składa się z części wyniku kropkowego i można go zdefiniować jako
> matmul (a, b) _ {i, j, k, c} =
Widzisz więc, że matmul (a, b) zwraca tablicę o małym kształcie, która ma mniejsze zużycie pamięci i ma większy sens w aplikacjach. W szczególności, łącząc się z nadawaniem , możesz uzyskać
matmul (a, b) _ {i, j, k, l} =
na przykład.
Z powyższych dwóch definicji można zobaczyć wymagania dotyczące korzystania z tych dwóch operacji. Załóżmy, że a.shape = (s1, s2, s3, s4) i b.shape = (t1, t2, t3, t4)
Aby użyć kropki (a, b) , potrzebujesz
- t3 = s4 ;
Aby użyć matmul (a, b) potrzebujesz
- t3 = s4
- t2 = s2 lub jedno z t2 i s2 wynosi 1
- t1 = s1 lub jedno z t1 i s1 to 1
Użyj poniższego fragmentu kodu, aby się przekonać.
Przykład kodu
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