В настоящее время я передаю из Cython в C следующий указатель указателя:
#convert the input Python 2D array to a memory view
cdef double[:,:] a_cython= np.asarray(a,order="C")
#define a pointer of a pointer with dimensions of a
cdef double** point_to_a = <double **>malloc(N * sizeof(double*))
#initialize the pointer
if not point_to_a: raise MemoryError
#try:
for i in range(N):
point_to_a[i] = &a_cython[i, 0]
#pass this double pointer to a C function
logistic_sigmoid(&point_to_a[0], N,M)
где a
— массив numpy, размеры которого равны N x M
, point_to_a
— это указатель Cython на указатель, который ссылается на представление памяти Cython a_cython
. Поскольку ввод a
из Python представляет собой двумерный массив, я подумал, что это лучший подход для передачи информации непосредственно в C. Переход проходит гладко, и вычисления выполняются правильно. Однако сейчас я пытаюсь повторно преобразовать обратно point_to_a
в массив numpy, но я немного борюсь.
Я рассматриваю различные решения. Я хотел бы изучить, возможно ли сохранить N-мерный массив на протяжении всего процесса, поэтому я экспериментировал с этим подходом в Cython:
#define a integer array for dimensions
cdef np.npy_intp dims[2]
dims[0]= N
dims[1] = M
#create a new memory view and PyArray_SimpleNewFromData to deal with the pointer
cdef np.ndarray[double, ndim=2] new_a = np.PyArray_SimpleNewFromData(2, &dims[0], np.NPY_DOUBLE, point_to_a)
однако, когда я преобразовываю new_a
в np.array как array = np.asarray(new_a)
, у меня есть массив только с 0. У тебя есть идеи?
Спасибо большое
a_cython._base
Я совсем забыл об этом! и большое спасибо за вашу тяжелую работу в репозитории косвенного_буфера. Определенно супер-ресурс для регулярного использования. Бесконечно благодарен! 29.05.2020