2010-07-07 62 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