Estoy utilizando una biblioteca C envuelta Python (a través de ctypes
) para ejecutar una serie de cálculos. En diferentes etapas de la ejecución, quiero obtener datos en Python, y específicamente en las matrices numpy
.Obteniendo datos de ctypes array en numpy
La envoltura estoy usando hace dos tipos diferentes de cambio de datos de la matriz (que es de particular interés para mí):
ctypes
matriz: Cuando hagotype(x)
(donde x es elctypes
serie, aparece un<class 'module_name.wrapper_class_name.c_double_Array_12000'>
a cambio sé que estos datos son una copia de los datos internos de la documentación y soy capaz de conseguirlo en una matriznumpy
fácilmente:.>>> np.ctypeslib.as_array(x)
Esto devuelve una matriz 1D numpy
de los datos.
ctype
puntero a los datos: En este caso, de la documentación de la biblioteca, entiendo que estoy recibiendo un puntero a los datos almacenados y usados directamente a la biblioteca. Suero que hagotype(y)
(donde y es el puntero) Obtengo<class 'module_name.wrapper_class_name.LP_c_double'>
. Con este caso todavía soy capaz de indexar a través de los datos comoy[0][2]
, pero sólo fue capaz de conseguir en numpy a través de un súper incómoda:>>> np.frombuffer(np.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
He encontrado esto en un viejo numpy
lista de correo thread from Travis Oliphant , pero no en la documentación numpy
. Si en lugar de este enfoque trato que el anterior me sale el siguiente:
>>> np.ctypeslib.as_array(y)
...
... BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
¿Es esta np.frombuffer
se aproximan al mejor o la única manera de hacer esto? Estoy abierto a otras sugerencias, pero aún así me gustaría usar numpy
ya que tengo muchos otros códigos de postprocesamiento que dependen de la funcionalidad numpy
que deseo utilizar con estos datos.
¿tiene el control o ver el C lib? ¿Podrías cambiar la API de la biblioteca? –
Sí, tengo la fuente. No estoy seguro de qué camino tomar, ya que el enfoque del puntero permite a Python actuar directamente sobre los datos, lo que supongo que en algunos casos podría ser una ventaja. Sin embargo, en mi caso, sí, sería una ventaja que todo salga como una matriz 'ctype'. ¿Alguna recomendación? – dtlussier
Sugiero que la biblioteca use una matriz (NumPy-) que asigne en Python y la pase a la biblioteca. De esta forma, puedes actuar en el mismo recuerdo, pero no tienes que molestarte en hacer conversiones torpes. Ya tiene una matriz NumPy, y pasarla a una biblioteca es bien soportada usando ['numpy.ctypeslib.ndpointer'] (http://docs.scipy.org/doc/numpy/reference/routines.ctypeslib.html # numpy.ctypeslib.ndpointer) como tipo de argumento para el contenedor ctypes de su función. (Si esto no está claro, solo pregunte ...) –