Gire eficientemente un conjunto de puntos con una matriz de rotación en números.

Tengo una lista de puntos 3D almacenados en la matriz de números A con forma (N,3) y una matriz de rotación R con forma (3,3) . Me gustaría calcular el producto de puntos de Rx para cada punto x en A en el lugar. De manera ingenua puedo hacer esto:

 for n in xrange(N): A[n,:] = dot(R, A[n,:]) 

¿Hay una manera de vectorizar esto con una llamada natpy? Si importa, N está en el orden de un par de miles.

Puedes multiplicar A con la transposición de la matriz de rotación:

 A = dot(A, RT) 

Hay un par de actualizaciones menores / puntos de aclaración para agregar a la respuesta (correcta) de Aapo Kryola. Primero, la syntax de la multiplicación de matrices se puede simplificar ligeramente utilizando el operador de multiplicación de matrices recientemente agregado @ :

 A = A @ RT 

Además, puede organizar la transformación en la forma estándar (matriz de rotación primero) tomando la transposición de A antes de la multiplicación, y luego transponiendo el resultado:

 A = (R @ AT).T 

Puede verificar que ambas formas de la transformación produzcan los mismos resultados a través de la siguiente afirmación:

 np.testing.assert_array_equal((R @ AT).T, A @ RT)