Использование массива numpy float32 в c ++ через swig - PullRequest
1 голос
/ 21 марта 2020

Я новичок в 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)
}
...