Как мне преобразовать numpy ND-массив в массив CFFI C ++ и обратно?

Я хочу передать массив numpy в некоторый (еще один) код C ++ через CFFI. Предположим, я не могу (ни в каком смысле) изменить код C ++, интерфейс которого:

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

Я передаю Nbins как целое число Python, ParamsArray как структуру dict ->, но DataArray (shape = 3 x NBins, который необходимо заполнить из массива numpy, вызывает у меня головную боль. (Cast_matrix from Почему cffi намного быстрее, чем 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


person jtlz2    schedule 17.06.2016    source источник
comment
Ну, эта функция cast_matrix предназначена для массива массивов, а не для одномерного массива (double ** против double *). Думаю, тебе просто нужно DataArray = ffi.cast("double *", data.ctypes.data). Убедитесь, что data смежен с C.   -  person    schedule 18.06.2016
comment
Спасибо - работает! :)   -  person jtlz2    schedule 18.06.2016


Ответы (1)


Спасибо @morningsun!

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

работает!

person jtlz2    schedule 18.06.2016