es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    @jit(nopython=True)
    def rotation_matrix(theta_x, theta_y, theta_z):
        # Convertir a radianes. Para asegurar rotaciones en sentido antihorario (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 = [[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.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.cos(theta_z_rad), -np.sin(theta_z_rad), 0],
              [np.sin(theta_z_rad), np.cos(theta_z_rad), 0],
              [0, 0, 1]]
    
        # Convertir listas en matrices de NumPy
        Rx_np = np.array(Rx)
        Ry_np = np.array(Ry)
        Rz_np = np.array(Rz)
    
        # Calcular la matriz de rotación total
        R = np.dot(Rz_np, np.dot(Ry_np, Rx_np))
        return R
    

    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.

Comments are closed.