使用 Pybind11 转换二维数组

Casting 2D array with Pybind11

我正在为我有 header/lib 个文件的 C++ 库创建 Python 绑定,但是 Pybind11 不会自动转换此将二维数组作为参数的函数。如何正确转换此参数?

头文件声明这个函数像

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:\Users\joona\git\someproject\pybind11\include\pybind11\cast.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:\Users\joona\git\someproject\build\temp.win-amd64-3.7\Release\someproject.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 将知道如何将其转换为二维列表。 此外,在您的 cpp 代码中,访问权限与 float[3][3].

相同

编辑:

根据你的评论,我认为你可以使用这样的东西(参见 from pybind documentation):

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数组。