2011-06-09 14 views
6

En numpy, la función numpy.dot() se puede usar para calcular el producto matricial de dos matrices 2D. Tengo dos matrices 3D X e Y (por ejemplo), y me gustaría calcular la matriz Z donde Z[i] == numpy.dot(X[i], Y[i]) para todos i. ¿Es posible hacerlo de forma no iterativa?encuentra el producto escalar de las sub-matrices en numpy

+0

Sobre qué eje/ejes ¿quieres hacer el producto? Para el caso en que X e Y fueron ambos 3x3, ¿cuál es el tamaño de Z? – talonmies

+0

@talonmies Si las dos matrices 3D son K x L x M y K x M x N, el resultado debería ser K x L x N. –

Respuesta

7

¿Qué tal:

from numpy.core.umath_tests import inner1d 
Z = inner1d(X,Y) 

Por ejemplo:

X = np.random.normal(size=(10,5)) 
Y = np.random.normal(size=(10,5)) 
Z1 = inner1d(X,Y) 
Z2 = [np.dot(X[k],Y[k]) for k in range(10)] 
print np.allclose(Z1,Z2) 

vuelve True

Editar corrección ya no vi la parte 3D de la cuestión

from numpy.core.umath_tests import matrix_multiply 
X = np.random.normal(size=(10,5,3)) 
Y = np.random.normal(size=(10,3,5)) 
Z1 = matrix_multiply(X,Y) 
Z2 = np.array([np.dot(X[k],Y[k]) for k in range(10)]) 
np.allclose(Z1,Z2) # <== returns True 

Esto funciona porque (como dice la cadena de documentación), matrix_multiply proporciona

matrix_multiply (x1, x2, [a cabo]) matriz

multiplicación en los últimos dos dimensiones

+0

Como está escrito, no creo que eso funcione si X e Y son 3D, aunque . – DSM

+0

@DSM - sí, lo olvidé originalmente. Ahora tengo la solución corregida. – JoshAdel

+0

La versión corregida se ve bien ... ¡gracias! Lo siento si mi pregunta inicial no estaba clara. –

Cuestiones relacionadas