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

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

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

我在这里使用 Eigen 只是为了描述目标,我相信 Eigen 不支持 3D 或更多维度、数组。

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

请您参考如下方法:

从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 允许您创建一个 lambda,您可以在其中为您的用例创建包装器。对于 return 也是如此,您可以获得 Eigen 类,创建一个用 Eigen 数据填充的 pybind 数组。

Eigen 具有您也可以使用的 Tensor 类。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!