Pybind11 如何从 python -> C++ 传递一个 n 维 numpy 数组

Pybind11 How to pass an n-dimentional numpy array from python -> c++

我有一个由 numpy 浮点数组组成的 numpy 数组,我希望将其传递给一个 c++ 函数,该函数将读取和修改数据,就好像它是一个 std::vector。 我正在努力弄清楚如何做到这一点。 c++ 参数类型是什么:

np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], dtype=float)

此类型声明:py::array_t<py::array_t<float>>

产生此错误:Attempt to use a non-POD or unimplemented POD type as a numpy dtype

而且我看不到让这个类型声明起作用:py:array

我搜索了文档、github 我可以在网上找到的问题和示例,但没有找到任何有用的或我能理解的东西,如果有人能帮助我解决这个问题,那就太好了赞赏:)

在 C++ 端引入 Eigen 库并将其用于矩阵运算。 std::vector 不是二维矩阵的良好抽象...要么你必须将自己的二维索引写入一维向量,要么你需要像 std::vector<std::vector<>> 这样愚蠢的东西,它表现非常糟糕而且很丑.

pybind11 知道自动将 np.array 转换为 Eigen::MatrixXf 的类型转换,因此您应该能够将 C++ 函数编写为采用 Eigen::MatrixXf input,并调用正如您指定的那样。

[最后一段是根据 OP 的评论添加的]

请注意,这将创建矩阵的副本,如果您想要引用传递(您应该这样做),pybind11 documentation 表示您的函数签名应使用 Eigen Ref 模板类型:my_cpp_fn(Eigen::Ref<Eigen::MatrixXf>)my_cpp_fn(const Eigen::Ref<Eigen::MatrixXf>)。以这种方式完成后,Python/C++ 接口上不应发生任何数据复制。