Как с помощью pybind11 связать функцию, которая принимает в качестве аргумента numpy.array (), например, с формой (10, 10, 3)? - PullRequest
0 голосов
/ 13 декабря 2018

Я хотел бы написать функцию, которая может принимать многомерный массив NumPy, а не только 2D.

void compute(Eigen::Ref<Eigen::MatrixXd> array3d) {
    // change the array in-place
    // ...
}

или

Eigen::MatrixXd &compute() {
    // create array
    // ...
    // and return it
}

Я использую Eigen здесь просто для изображенияцель, я полагаю, что Eigen не поддерживает трехмерные или более размерные массивы.

Я ценю ваши отзывы и терпение, поскольку я не знаком ни с Pybind11, ни с Eigen.

1 Ответ

0 голосов
/ 13 декабря 2018

Из информации 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, который вы также можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...