Em matemática, acho que o ponto em numpy faz mais sentido
ponto (a, b) _ {i, j, k, a, b, c} =
uma vez que dá o produto escalar quando a e b são vetores, ou a multiplicação da matriz quando a e b são matrizes
Quanto à operação matmul em numpy, consiste em partes do resultado de ponto , e pode ser definido como
> matmul (a, b) _ {i, j, k, c} =
Portanto, você pode ver que matmul (a, b) retorna um array com um formato pequeno, que tem menor consumo de memória e faz mais sentido nos aplicativos. Em particular, combinando com a transmissão , você pode obter
matmul (a, b) _ {i, j, k, l} =
por exemplo.
A partir das duas definições acima, você pode ver os requisitos para usar essas duas operações. Assuma a.shape = (s1, s2, s3, s4) e b.shape = (t1, t2, t3, t4)
Para usar o ponto (a, b) você precisa
- t3 = s4 ;
Para usar matmul (a, b) você precisa
- t3 = s4
- t2 = s2 , ou um de t2 e s2 é 1
- t1 = s1 , ou um de t1 e s1 é 1
Use o código a seguir para se convencer.
Amostra de código
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