Matriz de rotación numba con arreglos multidimensionales
Estoy intentando usar Numba para acelerar algunas funciones, en particular una función que realiza una rotación en 3D dadas tres ángulos, como se muestra a continuación:
import numpy as np
from numba import jit
@jit(nopython=True)
def matriz_rotación(theta_x, theta_y, theta_z):
# Convertir a radianes. Para garantizar rotaciones en sentido contrario a las agujas del reloj (ccw), tomar el negativo de los ángulos.
theta_x_rad = -np.radians(theta_x)
theta_y_rad = -np.radians(theta_y)
theta_z_rad = -np.radians(theta_z)
# Definir matrices de rotación (yaw, pitch, roll)
Rx = np.array([[1, 0, 0],
[0, np.cos(theta_x_rad), -np.sin(theta_x_rad)],
[0, np.sin(theta_x_rad), np.cos(theta_x_rad)]
])
Ry = np.array([[np.cos(theta_y_rad), 0, np.sin(theta_y_rad)],
[0, 1, 0],
[-np.sin(theta_y_rad), 0, np.cos(theta_y_rad)]
])
Rz = np.array([[np.cos(theta_z_rad), -np.sin(theta_z_rad), 0],
[np.sin(theta_z_rad), np.cos(theta_z_rad), 0],
[0, 0, 1]
])
# Calcular la matriz de rotación total
R = np.dot(Rz, np.dot(Ry, Rx))
return R
La función es relativamente sencilla, pero cuando Numba la llama, arroja un error cuando intento definir Rx
. Parece que Numba tiene un problema con las matrices multidimensionales (?). No estoy seguro de cómo modificar esto para que Numba lo pueda utilizar. Agradecería cualquier ayuda.
davy.ai
Numba no admite matrices de NumPy como entradas o salidas cuando se utiliza el decorador
jit
. Sin embargo, Numba proporciona soporte para funciones y creación limitada de matrices de NumPy dentro de las funciones decoradas. Puede solucionar esta limitación en su código utilizando listas en lugar de matrices de NumPy, luego convirtiendo las listas en matrices de NumPy antes de devolverlas.Aquí hay una versión modificada de su código que utiliza listas en lugar de matrices de NumPy:
Tenga en cuenta que definimos las matrices de rotación utilizando listas en lugar de matrices de NumPy, luego las convertimos en matrices de NumPy antes de calcular la matriz de rotación total. Esto parece resolver el problema de Numba al no admitir matrices de NumPy multidimensionales.
También tenga en cuenta que para usar
np.dot
con listas, necesitábamos convertirlas primero en matrices de NumPy.