Python 如何将numpy ND数组转换为CFFI C++;又回来了? 我想通过CFFI将一个NUMPY数组传递到一些(C++)代码中。假设我不能(无论如何)改变C++代码,其接口为: double CompactPD_LH(int Nbins, double * DataArray, void * ParamsArray ) { ... }

Python 如何将numpy ND数组转换为CFFI C++;又回来了? 我想通过CFFI将一个NUMPY数组传递到一些(C++)代码中。假设我不能(无论如何)改变C++代码,其接口为: double CompactPD_LH(int Nbins, double * DataArray, void * ParamsArray ) { ... },python,c++,arrays,numpy,python-cffi,Python,C++,Arrays,Numpy,Python Cffi,我将Nbins作为python整数传递,将ParamsArray作为dict->structure传递,但是DataArray(shape=3 x Nbins,需要从numpy数组填充)让我头疼。(这里的cast_matrix没有帮助:( 以下是一个失败的尝试: from blah import ffi,lib data=np.loadtxt(histof) DataArray=cast_matrix(data,ffi) # see https://stackoverflow.com/quest

我将Nbins作为python整数传递,将ParamsArray作为dict->structure传递,但是DataArray(shape=3 x Nbins,需要从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_矩阵为:

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 
此外:

谢谢@morningsun

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

有效!

好吧,这个
cast\u matrix
函数是用于“数组数组数组”,而不是1D数组(
double**
vs.
double*
)。我想你只需要
DataArray=ffi.cast(“double*”,data.ctypes.data)
。确保
data
是C连续的。谢谢-有效!)