将ctypes指针转换为numpy浮点数组

时间:2016-02-03 17:13:22

标签: python c numpy ctypes

我正在使用C库并将其与python接口,而不需要太多细节,我的库有一个C函数,我们将调用'foo'返回void const *(它返回float const *或double const *取决于应用程序)。在python中,我将其声明为:

from ctypes import *
mylib = cdll.LoadLibrary('mylib.so')

foo = mylib.foo
foo.restype = c_void_p

从现在开始,我们将假设我们使用float而不是double并将指针的预期尺寸指定为'D',例如12

D = 12

我正在尝试将返回值的深层副本复制到python numpy数组中,这样我就不必担心被释放的C库分配的内存,我尝试按如下方式实现它:

import numpy as np
x = np.frombuffer(foo(), np.float32, D * np.dtype(np.float32).itemsize).copy()

AttributeError: 'int' object has no attribute '__buffer__'

但它似乎不起作用,我认为'foo'的返回类型将是ctypes c_void_p类型的python对象,但实际上它只是一个int。我猜测int的值对应于数组中第一个float的内存中的地址,但也许我错了。必须有一个简单的方法来做这个,有人有任何建议吗?

如果您想了解更多详情(关于图书馆等),请告诉我,我试图让问题变得简单。

感谢。

1 个答案:

答案 0 :(得分:2)

感谢eryksun的评论:

x = np.frombuffer((c_float * D).from_address(foo()), np.float32).copy()