Accediendo al contenido de una matriz de variables con ctypes.

Uso ctypes para acceder a un archivo que lee la función C en python. Como los datos leídos son enormes y desconocidos en tamaño, uso **float en C.

int read_file(const char *file,int *n_,int *m_,float **data_) {...}

Las funciones mallocs una matriz 2d, llamada data , del tamaño apropiado, aquí n , y copia los valores a los referenciados. Vea el siguiente fragmento de código:

 *data_ = data; *n_ = n; *m_ = m; 

Accedo a esta función con el siguiente código de python:

 p_data=POINTER(c_float) n=c_int(0) m=c_int(0) filename='datasets/usps' read_file(filename,byref(n),byref(m),byref(p_data)) 

Luego trato de acceder a p_data usando contents , pero solo obtengo un valor flotante único.

 p_data.contents c_float(-1.0) 

Mi pregunta es: ¿Cómo puedo acceder a los data en Python?

¿Qué me has recomendado? Por favor, no dude en señalar si dejé algo claro!

podría ser más sencillo hacer todo en Python con la biblioteca struct . pero si estás vendido en ctypes (y no te culpo, es genial):

 #include  void floatarr(int* n, float** f) { int i; float* f2 = malloc(sizeof(float)*10); n[0] = 10; for (i=0;i<10;i++) { f2[i] = (i+1)/2.0; } f[0] = f2; } 

y luego en python:

 from ctypes import * fd = cdll.LoadLibrary('float.dll') fd.floatarr.argtypes = [POINTER(c_int),POINTER(POINTER(c_float))] fpp = POINTER(c_float)() ip = c_int(0) fd.floatarr(pointer(ip),pointer(fpp)) print ip print fpp[0] print fpp[1] 

El truco es que las mayúsculas POINTER hacen un tipo y el pointer minúscula hace un puntero al almacenamiento existente. Puedes usar byref lugar de pointer , dicen que es más rápido. Me gusta más el pointer porque está más claro lo que está pasando.