如何使用NumPy数组与ctypes?
问题描述:
我仍在使用ctypes编写我的c代码的python接口。今天,我用python版本取代了我的文件阅读功能,这个版本由其他人使用NumPy编程。 'old'c版本用byref(p_data)调用,而p_data = PFloat()(见下文)。主函数采用p_data。如何使用NumPy数组与ctypes?
旧文件读出:
p_data=POINTER(c_float)
foo.read(filename,byref(p_data))
result=foo.pymain(p_data)
在另一方面蛇皮文件读取功能返回NumPy的阵列。我现在的问题是:
如何将NumPy数组转换为POINTER(c_float)?
我GOOGLE了,但只找到了其他方式:C arrays through ctypes accessed as NumPy arrays和东西我不明白:C-Types Foreign Function Interface (numpy.ctypeslib)
[更新] 示例代码纠正一个错误
答
你的代码看起来像它有一些混淆 - ctypes.POINTER()
创建一个新的ctypes指针类,而不是一个ctypes实例。无论如何,将NumPy数组传递给ctypes代码的最简单方法是使用numpy.ndarray
的属性的data_as
方法。只要确保基础数据是第一个正确的类型。例如:
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)
谢谢!这真的很有帮助! – 2016-07-07 04:37:22