如何将numpy nd-array转换为cffi c 数组,然后再次返回

How do I convert a numpy ND-array to a CFFI C++ array and back again?

本文关键字:数组 然后 返回 cffi numpy nd-array 转换      更新时间:2023-10-16

我想通过CFFI将numpy数组传递到某些(另一个)的C 代码中。假设我无法(从任何意义上)更改C 代码,其接口为:

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

i通过python integer将nbins作为paramsarray作为dict->结构,但是dataArray(shape = 3 x nbins,需要从numpy阵列中填充的shape = 3 x nbins,这给了我头痛。(cast_matrix为什么cffi cfffi是为什么比Numpy快得多?没有帮助:(

这是一次失败的尝试:

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 

也:

如何将Numpy数组传递到CFFI函数中以及如何恢复一个?

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

谢谢@morningsun!

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

工作!

相关文章: