У меня есть функция C ++, вычисляющая большой тензор, который я хотел бы вернуть в Python в виде массива NumPy через pybind11 .
Из документации pybind11 кажется, что использование STL unique_ptr желательно. В следующем примере закомментированная версия работает, тогда как данная версия компилируется, но не работает во время выполнения («Невозможно преобразовать возвращаемое значение функции в тип Python!»).
Почему не работает версия smartpointer? Каков канонический способ создания и возврата массива NumPy?
PS: Из-за структуры программы и размера массива желательно не копировать память, а создавать массив по заданному указателю. Владение памятью должно принадлежать Python.
typedef typename py::array_t<double, py::array::c_style | py::array::forcecast> py_cdarray_t;
// py_cd_array_t _test()
std::unique_ptr<py_cdarray_t> _test()
{
double * memory = new double[3]; memory[0] = 11; memory[1] = 12; memory[2] = 13;
py::buffer_info bufinfo (
memory, // pointer to memory buffer
sizeof(double), // size of underlying scalar type
py::format_descriptor<double>::format(), // python struct-style format descriptor
1, // number of dimensions
{ 3 }, // buffer dimensions
{ sizeof(double) } // strides (in bytes) for each index
);
//return py_cdarray_t(bufinfo);
return std::unique_ptr<py_cdarray_t>( new py_cdarray_t(bufinfo) );
}