Я новичок в Swig и с трудом понимаю, почему я не могу получить правильные значения numpy массива в моем файле c ++. Сценарий: я пытаюсь расширить API C ++ до python, чтобы API python мог генерировать некоторые входные данные, которые являются массивом numpy типа float32, а затем получать процесс в моем коде C ++. Вот что я попробовал:
PyObject* func(PyObject* numpy_array, PyObject* pysize) {
auto size = static_cast<int>(PyLong_AS_LONG(pysize)); // This is correct
auto data = reinterpret_cast<float*>(PyBytes_AS_STRING(numpy_array)); // incorrect
return process_data_with_cpp_api(data, size);
}
Что я заметил, так это то, что размер корректно «переводится» в cpp int, однако «данные» после преобразования в float указатель не верный. Например, если я должен был распечатать первые несколько значений, я получаю несколько очень маленьких значений 0.5e-45 i sh, когда мой массив numpy - это просто входные данные между [-1,1].
Из здесь , PyBytes_AS_STRING
должен дать мне нулевой завершенный void*
буфер, который я должен быть в состоянии бросить в буфер float *. Может я просто что-то упустил?
Любой указатель будет оценен, каламбуры предназначены:)
РЕДАКТИРОВАТЬ: я забыл указать, что я также добавил карты типов:
%numpy_typemaps(float, NPY_FLOAT32, size_t)
%apply (float* IN_ARRAY1, size_t DIM1) {
(const float* input, size_t in_size)
}