2010-12-20 12 views
13

Tengo una matriz P con forma MxN y un tensor 3d T con forma KxNxR. Quiero multiplicar P con cada matriz NxR en T, lo que resulta en un tensor 3D KxMxR.Numpy: Multiplicar una matriz con un tensor 3d - Sugerencia

P.dot(T).transpose(1,0,2) da el resultado deseado. ¿Hay una solución más bonita (es decir, deshacerse de transpose) a este problema? Esta debe ser una operación bastante común, por lo que supongo, otros han encontrado diferentes enfoques, por ejemplo. usando tensordot (que intenté pero no obtuve el resultado deseado). Opiniones/Vistas serían muy apreciadas!

Respuesta

6
scipy.tensordot(P, T, axes=[1,1]).swapaxes(0,1) 
+1

Ja! Observé el resultado de 'scipy.tensordot (P, T, axes = [1,1]]' durante horas ayer, desesperado por las dimensiones intercambiadas. No sabía nada sobre swapaxes, ¡gracias! – osdf

+0

De nada. También verifiqué que el intercambio de los ejes da la respuesta numérica correcta, y lo hace. –

2

También es posible usar la notación de sumatoria Einstein:

P = numpy.random.randint(1,10,(5,3)) 
P.shape 
T = numpy.random.randint(1,10,(2,3,4)) 
T.shape 

numpy.einsum('ij,kjl->kil',P,T) 

que deberían dar los mismos resultados como:

P.dot(T).transpose(1,0,2) 
Cuestiones relacionadas