2010-07-07 22 views
9

Todavía estoy escribiendo en una interfaz de python para mi código c con ctypes. Hoy sustituí mi función de lectura de archivos por una versión de Python, que fue programada por otra persona con NumPy. La 'vieja' versión c fue llamada con un byref (p_data) mientras que p_data = PFloat() (ver a continuación). La función principal toma p_data.¿Cómo usar la matriz NumPy con ctypes?

vieja lectura de archivos:

p_data=POINTER(c_float) 
foo.read(filename,byref(p_data)) 
result=foo.pymain(p_data) 

La función de lectura de archivos pitón por el contrario devuelve una matriz NumPy. Mi pregunta ahora es:

¿Cómo convierto una matriz NumPy en POINTER (c_float)?

Googled pero sólo encontré al revés: C arrays through ctypes accessed as NumPy arrays y cosas que no comprendían: C-Types Foreign Function Interface (numpy.ctypeslib)

[Actualización] corregido un error en el código de ejemplo

Respuesta

15

el código tiene que tiene alguna confusión en él - ctypes.POINTER() crea un nuevo puntero ctypes clase, no una instancia de ctypes. De todos modos, la manera más fácil de pasar una matriz NumPy al código de códigos es usar el ctypes del atributo ctypes del método data_as. Solo asegúrese de que los datos subyacentes sean los correctos primero. Por ejemplo:

c_float_p = ctypes.POINTER(ctypes.c_float) 
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]]) 
data = data.astype(numpy.float32) 
data_p = data.ctypes.data_as(c_float_p) 
+0

¡Gracias! ¡Esto fue realmente útil! –