나는 CFFI를 통해 (다른 하나의) C++ 코드에 수치적인 배열을 전달하려고한다. I는 (어떤 의미에서) 그 인터페이스 인 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' 함수는 1D 배열 ('double **'과'double *')이 아닌 "배열 배열"을위한 함수입니다. 난 단지'DataArray = ffi.cast ("double *", data.ctypes.data)'가 필요하다고 생각한다. 'data'가 C 연속적인지 확인하십시오. –
감사합니다 - 작동합니다! :) – jtlz2