Я использую Python (через ctypes
) завернутую библиотеку C для запуска серии вычислений. На разных этапах работы я хочу получить данные в Python и, в частности, numpy
массивы.
Используемая обертка использует два разных типа возврата для данных массива (что меня особенно интересует):
-
ctypes
Массив. Когда я делаюtype(x)
(где x - массивctypes
, я возвращаю<class 'module_name.wrapper_class_name.c_double_Array_12000'>
. Я знаю, что эти данные являются копия внутренних данных из документации, и я могу легко получить ее в массивnumpy
:>>> np.ctypeslib.as_array(x)
Это возвращает массив данных 1D numpy
.
-
ctype
указатель на данные. В этом случае из документации библиотеки я понимаю, что получаю указатель на данные, хранящиеся и используемые непосредственно в библиотеке. Whey я dotype(y)
(где y - указатель) Я получаю<class 'module_name.wrapper_class_name.LP_c_double'>
. В этом случае я все еще могу индексировать данные, такие какy[0][2]
, но я мог только получить его в numpy через супер неудобно:>>> np.frombuffer(np.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
Я нашел это в старом numpy
списке рассылки от Travis Oliphant, но не в документации numpy
. Если вместо этого подхода я попробую, как указано выше, я получаю следующее:
>>> np.ctypeslib.as_array(y)
...
... BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
Подходит ли этот np.frombuffer
лучший или единственный способ сделать это? Я открыт для других предложений, но мне все равно хотелось бы использовать numpy
, поскольку у меня есть много других постобработок, которые полагаются на функциональность numpy
, которую я хочу использовать с этими данными.