簡體   English   中英

如何用pybind11綁定一個以numpy.array()作為參數(例如,形狀為(10,10,3))的函數?

[英]How with pybind11 to bind a function that takes as argument a numpy.array() with, for instance, a shape (10, 10, 3)?

我想編寫一個可以采用多維numpy數組,而不僅僅是2D的函數。

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信息中,您可以提取尺寸信息。

例如,這是我做的內部音頻工具包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,您可以在其中創建用例的包裝。 同樣的返回方法,您可以獲取Eigen類,創建一個用Eigen數據填充的pybind數組。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM