【问题标题】:Pybind11 How to pass an n-dimentional numpy array from python -> c++Pybind11 如何从 python -> c++ 传递一个 n 维 numpy 数组
【发布时间】:2021-12-18 05:06:01
【问题描述】:

我有一个 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 问题和示例,但没有找到任何有效或我能理解的东西,如果有人可以帮助我,我将不胜感激 :)

【问题讨论】:

    标签: python c++ numpy-ndarray pybind11


    【解决方案1】:

    在 C++ 端引入 Eigen 库并将其用于矩阵运算。 std::vector 不是 2d 矩阵的一个很好的抽象......要么您必须将自己的 2d 索引写入 1d 向量,或者您需要像 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++ 接口上发生数据复制。

    【讨论】:

    • 感谢您的回复 - 按预期工作!我认为通过引用传递方法将起作用:pybind11.readthedocs.io/en/latest/advanced/cast/…
    • 是的,这是一个很好的观点。正如您的参考所暗示的,我的示例应该说您的 C++ 函数应该接受 Eigen::Ref<Eigen::MatrixXf>const Eigen::Ref<Eigen::MatrixXf>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多