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
好吧,這個'cast_matrix'函數是用於「數組數組」的,而不是一維數組(double **'vs.'double *')。我想你只需要'DataArray = ffi.cast(「double *」,data.ctypes.data)'。確保'數據'是C連續的。 –
謝謝 - 作品! :) – jtlz2