Multiplica la matriz por cada fila de otra matriz en Numpy.

Tengo una matriz de transformación homogénea de tamaño (4×4) y una trayectoria de tamaño (nx3). Cada fila de esta trayectoria es un vector.

Quiero multiplicar la matriz de transformación homogénea por cada fila de trayectoria. A continuación se muestra el código:

#append zero column at last trajectory = np.hstack((trajectory, np.zeros((trajectory.shape[0], 1)))) #(nx3)->(nx4) trajectory_new = np.zeros((1, 3)) #(1x3) for row in trajectory: vect = row.reshape((-1,1)) #convert (1x4) to (4x1) vect = np.dot(HTM, vect) #(4x4) x (4x1) = (4x1) vect = vect.T #(1x4) vect = np.delete(vect, -1, axis=1) #remove last element from vector trajectory_new = np.vstack((trajectory_new, vect)) #(nx3) trajectory_new = np.delete(trajectory_new, 0, axis=0)#remove first row 

El código anterior funciona. Sin embargo, estoy buscando una solución más simple, como la siguiente:

 trajectory_new = np.apply_along_axis(np.multiply, 0, trajectory, HTM) 

Cualquier ayuda, por favor.

Responder:

 trajectory = np.hstack((trajectory, np.ones((trajectory.shape[0], 1))))#(nx3)->(nx4) trajectory_new = trajectory.dot(HTM.T)[:,:-1] 

¿Podrías incluir un ejemplo de entrada y salida? Pero parece que np.dot(HTM, trajectory.T)[:3].T podría hacer el truco?

En lugar de agregar una columna de 0 a la trajectory , ¿por qué no suelta la última fila de HTM ?

Creo que lo que quieres es algo como:

 trajectory_new = np.einsum('ij,kj->ik', HTM[:,:3], trajectory) 

No estoy seguro sobre el orden, pero debería funcionar mucho más rápido que for bucles

Simplemente puede usar la multiplicación de np.dot con np.dot en la entrada antes de astackr zeros

 trajectory.dot(HTM[:,:3].T)[:,:3] 

Enfoques –

 def dot_based(trajectory): return trajectory.dot(HTM[:,:3].T)[:,:3] def original_app(trajectory): # append zero column at last traj_stacked = np.hstack((trajectory, np.zeros((trajectory.shape[0], 1)))) trajectory_new = np.zeros((1, 3)) #(1x3) for row in traj_stacked: vect = row.reshape((-1,1)) #convert (1x4) to (4x1) vect = np.dot(HTM, vect) #(4x4) x (4x1) = (4x1) vect = vect.T #(1x4) vect = np.delete(vect, -1, axis=1) #remove last element from vector trajectory_new = np.vstack((trajectory_new, vect)) #(nx3) trajectory_new = np.delete(trajectory_new, 0, axis=0)#remove first row return trajectory_new 

Ejecución de la muestra

 In [37]: n = 5 ...: trajectory = np.random.rand(n,3) ...: HTM = np.random.rand(4,4) ...: In [38]: np.allclose(dot_based(trajectory), original_app(trajectory)) Out[38]: True