2016-06-17 65 views
1

我想通過CFFI將一個numpy數組傳遞給一些(另一個)C++代碼。假設我不能(在任何意義上)改變C++代碼,其接口是:如何將numpy ND數組轉換爲CFFI C++數組並再次返回?

double CompactPD_LH(int Nbins, double * DataArray, void * ParamsArray) { 
    ... 
} 

我通過Nbins作爲蟒整數,ParamsArray作爲一個字典 - >的結構,但DataArray中(形狀= 3×NBins,其。需要從一個numpy的數組填充,是讓我頭疼(從Why is cffi so much quicker than numpy? cast_matrix是沒有幫助這裏:(

這裏有一個嘗試失敗:

from blah import ffi,lib 
data=np.loadtxt(histof) 
DataArray=cast_matrix(data,ffi) # see https://stackoverflow.com/questions/23056057/why-is-cffi-so-much-quicker-than-numpy/23058665#23058665 
result=lib.CompactPD_LH(Nbins,DataArray,ParamsArray) 

僅供參考,cast_matrix是:

def cast_matrix(matrix, ffi): 
    ap = ffi.new("double* [%d]" % (matrix.shape[0])) 
    ptr = ffi.cast("double *", matrix.ctypes.data) 
    for i in range(matrix.shape[0]): 
     ap[i] = ptr + i*matrix.shape[1] 
    return ap 

另外:

How to pass a Numpy array into a cffi function and how to get one back out?

https://gist.github.com/arjones6/5533938

+1

好吧,這個'cast_matrix'函數是用於「數組數組」的,而不是一維數組(double **'vs.'double *')。我想你只需要'DataArray = ffi.cast(「double *」,data.ctypes.data)'。確保'數據'是C連續的。 –

+0

謝謝 - 作品! :) – jtlz2

回答

2

感謝@morningsun!

dd=np.ascontiguousarray(data.T) 
DataArray = ffi.cast("double *",dd.ctypes.data) 
result=lib.CompactPD_LH(Nbins,DataArray,ParamsArray) 

作品!

相關問題