Из информации pybind вы можете извлечь информацию о размерах.
Например, это то, что я делаю внутри Audio ToolKit с m
текущим модулем Python, который вы хотите построить:
py::class_<MyClass>(m,"name")
.def("set_pointer", [](MyClass& instance, const py::array_t<DataType>& array)
{
gsl::index channels = 1;
gsl::index size = array.shape(0);
if(array.ndim() == 2)
{
channels = array.shape(0);
size = array.shape(1);
}
// Call using array.data() and possibly add more dimension information, this is specific to my use case
instance.set_pointer(array.data(), channels, size);
});
Из этого вы можете вместо этого создать вызов Eigen::Map
, чтобы создать подобную Eigen матрицу, которую вы можете использовать в своем шаблонном коде.
По сути, pybind11 позволяет вам создать лямбду, где вы можете создать свою обертку для вашего случая использования.То же самое работает для возврата, вы можете получить класс Eigen, создать массив pybind, который вы заполняете данными Eigen.
Eigen имеет класс Tensor, который вы также можете использовать.