使用 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数组。
我正在为我有 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数组。