2016-12-19 93 views
0

我使用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函數之前複製所有參數是不可避免的?

回答