2016-06-17 6 views
1

나는 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

+1

글쎄,이'cast_matrix' 함수는 1D 배열 ('double **'과'double *')이 아닌 "배열 배열"을위한 함수입니다. 난 단지'DataArray = ffi.cast ("double *", data.ctypes.data)'가 필요하다고 생각한다. '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) 

작품!

관련 문제