用pybind11铸造2D阵列

Casting 2D array with Pybind11

本文关键字:阵列 2D 铸造 pybind11      更新时间:2023-10-16

我正在为我的标头/lib文件创建python绑定,但是将2D数组作为参数的pybind11 by fare taund bander/lib files创建。我如何正确转换此参数?

标题文件将此功能称为

class __declspec(dllimport) SomeClass {
    public:
        void function(uint32_t arg1, uint32_t arg2, float matrix[3][3]);

我像

一样绑定它
py::class_<SomeClass>(m, "_SomeClass", "SomeClass")
    .def("function", &SomeClass::function,
    py::arg("arg1"), py::arg("arg2"), py::arg("matrix"))

python setup.py bdist_wheel输出以下内容(评论function绑定构建轮子罚款(

C:Usersjoonagitsomeprojectpybind11includepybind11cast.h(1931,1): error C2664:  'Return pybind11::cpp_function::{ctor}::<lambda_b1f1895366c1273186f52810f5be9d13>::operator ()(Class *,uint32_t ,uint32_t ,float (*)[3]) const': cannot convert argument 4 from 'float *' to 'float (*)[3]' [C:Usersjoonagitsomeprojectbuildtemp.win-amd64-3.7Releasesomeproject.vcxproj]

我会选择std::array

class __declspec(dllimport) SomeClass {
    public:
        void function(uint32_t arg1, uint32_t arg2,
                      std::array<std::array<float,3>,3> matrix);
...
};

pybind将知道如何将其转换为2D列表。另外,在您的CPP代码内,访问与float[3][3]相同。

编辑:

按照您的评论,我认为您可以使用类似的内容(请参阅Pybind文档(:

py::class_<SomeClass>(m, "SomeClass")
   .def("function", [](SomeClass& sc, uint32_t arg1, uint32_t arg2,
                       std::array<std::array<float,3>,3> m)
        {
            float M[3][3] = {{m[0][0], m[0][1], m[0][2]},
                             {m[1][0], m[1][1], m[1][2]},
                             {m[2][0], m[2][1], m[2][2]}};
            return sc.function(arg1, arg2, M);
        });

在这里,我假设矩阵只是该函数的输入。您可以将结果复制到STD数组,如果也已输出。