Что касается метода ascontiguousarray
, я предполагаю, что он довольно медленный, поскольку python должен выполнить некоторые операции с памятью, чтобы вернуть C-подобный непрерывный массив.
РЕДАКТИРОВАТЬ 1:
Я видел этот ответ , очевидно, функция imread
openCV уже должна возвращать непрерывный массив.
Я не очень знаком с ctypes
, но случайно использую библиотеку PyBind и могу только рекомендовать ее использовать. Он реализует буферный протокол Python , что позволяет вам взаимодействовать с данными Python практически без затрат.
Я ответил на вопрос , объясняющий, как передать массив numpy
из Python в C / C ++, сделать с ним что-то глупое в C ++ и вернуть динамически созданный массив обратно в Python.
РЕДАКТИРОВАТЬ 2: Я добавил простой пример, который получает массив Numpy, отправляет его в C и печатает его из C. Вы можете найти его здесь . Надеюсь, это поможет!
РЕДАКТИРОВАТЬ 3:
Чтобы ответить на ваш последний комментарий, да, вы определенно можете это сделать.
Вы можете изменить свой код так, чтобы (1) создать экземпляр двумерного массива в C ++, (2) передать ссылку на данные в вашу функцию C, которая изменит их вместо объявления матрицы, и (3) вернуть этот экземпляр в Python по ссылке. .
Ваша функция станет:
void ndarray_to_matrix(unsigned char* src, double * x, long* shape, long* strides)
{
int nb = shape[0];
int h = shape[1];
int w = shape[2];
int c = shape[3];
int step_b = strides[0];
int step_h = strides[1];
int step_w = strides[2];
int step_c = strides[3];
int b, i, j, k;
int index1, index2 = 0;
for(b = 0; b < nb ; ++b) {
for(i = 0; i < h; ++i) {
for(k= 0; k < c; ++k) {
for(j = 0; j < w; ++j) {
index1 = k*w*h + i*w + j;
index2 = step_b*b + step_h*i + step_w*j + step_c*k;
X.vals[b][index1] = src[index2]/255.;
}
}
}
}
}
И вы добавите в код оболочки C ++
// Instantiate the output array, assuming we know b, h, c,w
py::array_t<double> x = py::array_t<double>(b*h*c*w);
py::buffer_info bufx = x.request();
double*ptrx = (double *) bufx.ptr;
// Call to your C function with ptrx as input
ndarray_to_matrix(src, ptrx, shape, strides);
// now reshape x
x.reshape({b, h*c*w});
Не забудьте изменить прототип функции-оболочки C ++, чтобы она возвращала массив numpy
, например:
py::array_t<double> read_matrix(...){}...
Это должно сработать, хотя я не проверял:)