arrays - Pasando matrices Numpy a código C envuelto con Cython
(2)
El código de la interfaz de cython debe crearse de acuerdo con el tutorial que se proporciona here .
Para obtener un puntero de C a los datos en una matriz numpy, debe usar el atributo ctypes de la matriz numpy, que se describe here .
Tengo un poco de código C existente que quiero envolver usando Cython. Quiero poder configurar una serie de matrices numpy, y luego pasar esas matrices como argumentos al código C cuyas funciones tienen matrices c estándar (1d y 2d). Estoy un poco atascado en términos de averiguar cómo escribir el código .pyx adecuado para manejar las cosas adecuadamente.
Hay un puñado de funciones, pero una función típica en el archivo funcs.h se parece a algo como:
double InnerProduct(double *A, double **coords1, double **coords2, const int len)
Luego tengo un archivo .pyx que tiene una línea correspondiente:
cdef extern from "funcs.h":
double InnerProduct(double *A, double **coords1, double **coords2, int len)
donde me deshice de la const porque cython no lo soporta. Donde estoy atascado es cómo debe verse el código del contenedor para pasar una matriz numpy MxN a los argumentos ** coords1 y ** coords2.
Me ha costado encontrar la documentación o los tutoriales correctos para este tipo de problema. Cualquier sugerencia sería más apreciada.
Probablemente desee la función de "vistas de memoria escritas" de Cython, que puede leer aquí con todo detalle sangriento. Básicamente, esta es la forma más nueva y unificada de trabajar con numpy u otras matrices. Estos pueden ser expuestos en Python-land como matrices numpy, o puede exportarlos a Python (por ejemplo, here ). Debe prestar atención a cómo funciona el paso y asegurarse de que sea coherente con, por ejemplo, las matrices C-contiguas y las similares a FORTRAN, pero los documentos son bastante claros sobre cómo hacerlo.
Sin saber un poco más acerca de su función, es difícil ser más concreto exactamente sobre la mejor manera de hacer esto, es decir, ¿es la función C de solo lectura para los arreglos? (Creo que sí en función de la firma que dio, pero no estoy 100% seguro). Si es así, no debe preocuparse por hacer copias si es necesario para obtener estados contiguos a C, porque la función C no necesita hablar. de vuelta a la matriz numpy a nivel de Python. Pero las vistas de memoria escritas le permitirán hacer todo esto con un mínimo de esfuerzo.