2010-07-07 61 views
9

我仍在使用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)

[更新] 示例代码纠正一个错误

回答

15

你的代码看起来像它有一些混淆 - 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) 
+0

谢谢!这真的很有帮助! – 2016-07-07 04:37:22