Я использую 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, которую я хочу использовать с этими данными.