我使用ctypes在C和Python + numpy之間進行交互。雙方的代碼都是由我寫的。通常它按預期工作,但我遇到了一個我不明白的奇怪錯誤。numpy和ctypes:處理視圖
我的問題是:發生了什麼事?
我正在使用Linux(Manjaro 16.10),使用gcc 6.2.1。 python 2.7.12和numpy 1.11.2。
的簡化版本的我的C代碼:
void imp(double *M) {/*do stuff, assumes M is a 3x3 row-major matrix*/}
的簡化版本的我的Python代碼:
lib = ctypes.CDLL('path/to/lib.so')
def function(M):
assert(M.dtype == np.float64)
lib.imp(M.ctypes.data_as(ctypes.POINTER(ctypes.c_double)))
# Snippet 1: Doesn't work correctly, gives nonsense results.
print my_var.dtype # prints 'float64'
print my_var.shape # prints '(3, 3)'
function(my_var) # the assert in function doesn't fail
# Snippet 2: Works correctly, gives the expected results.
my_var = my_var.astype(np.float64) # (!!)
print my_var.dtype # The same...
print my_var.shape # ...as in...
function(my_var) # ...snippet 1
UPDATE
更換
my_var = my_var.astype(np.float64)
與
my_var = my_var.copy()
作品一樣好。顯然,問題的根源在於my_var是numpy的視圖(我通過打印my_var.base檢查了這一點)。
所以我修改後的問題是:如果這些數組實際上可能是視圖,那麼傳遞numpy數組與ctype的正確方法是什麼?在調用c函數之前複製所有參數是不可避免的?