matrices - ¿Cómo convierto una lista de Python en una matriz C utilizando ctypes?
matrices en python numpy (3)
Del tutorial de ctypes :
>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
Si tengo los siguientes 2 juegos de código, ¿cómo los pego?
void
c_function(void *ptr) {
int i;
for (i = 0; i < 10; i++) {
printf("%p", ptr[i]);
}
return;
}
def python_routine(y):
x = []
for e in y:
x.append(e)
¿Cómo puedo llamar a c_function con una lista contigua de elementos en x? Traté de lanzar x a un c_void_p, pero eso no funcionó.
También traté de usar algo como
x = c_void_p * 10
for e in y:
x[i] = e
pero esto obtiene un error de sintaxis
El código C claramente quiere la dirección de una matriz. ¿Cómo hago que esto suceda?
El siguiente código funciona en listas arbitrarias:
import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
Esta es una explicación de la respuesta aceptada.
ctypes.c_int * len(pyarr)
crea una matriz (secuencia) de tipo c_int
de longitud 4 ( python3 , python 2 ). Como c_int
es un objeto cuyo constructor toma un argumento, (ctypes.c_int * len(pyarr)(*pyarr)
hace un inicio de una toma de cada instancia de pyarr
desde pyarr
. Una forma más fácil de leer es:
pyarr = [1, 2, 3, 4]
seq = ctypes.c_int * len(pyarr)
arr = seq(*pyarr)
Use la función type
para ver la diferencia entre seq
y arr
.