Python 如何使用pybind11绑定一个以numpy.array()为参数的函数,例如一个形状(10,10,3)?

Python 如何使用pybind11绑定一个以numpy.array()为参数的函数,例如一个形状(10,10,3)?,python,c++,numpy,eigen,pybind11,Python,C++,Numpy,Eigen,Pybind11,我想写一个函数,它可以接受多维numpy数组,而不仅仅是二维数组 void compute(Eigen::Ref<Eigen::MatrixXd> array3d) { // change the array in-place // ... } 我在这里使用Eigen只是为了描述目标,我相信Eigen不支持3D或更多维度的阵列 感谢您的反馈和耐心,因为我不熟悉Pybind11和Eigen。从pybind信息中,您可以提取维度信息 例如,这就是我在m中使用您要构建的当

我想写一个函数,它可以接受多维numpy数组,而不仅仅是二维数组

void compute(Eigen::Ref<Eigen::MatrixXd> array3d) {
    // change the array in-place
    // ...
}
我在这里使用Eigen只是为了描述目标,我相信Eigen不支持3D或更多维度的阵列


感谢您的反馈和耐心,因为我不熟悉Pybind11和Eigen。

从pybind信息中,您可以提取维度信息

例如,这就是我在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);
});
由此,您可以创建调用来创建一个类似于本征矩阵的矩阵,您可以在模板化代码中使用它

基本上,pybind11允许您创建一个lambda,您可以在其中为您的用例创建包装器。同样的方法也适用于return,您可以获得Eigen类,创建一个pybind数组,用Eigen数据填充该数组

Eigen也可以使用张量类

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);
});