铸造pybind11 :: array_t to Mutable std :: vector

发布于 2025-01-27 13:19:37 字数 1445 浏览 3 评论 0原文

我有一个简单的C ++类,我想使用pybind11暴露于Python。问题是void c ++函数接受std :: vector&输入,pybind11 :: array_t是不可变的。因此,我不会得到修改的向量。

例子: C ++程序

#include<pybind11/numpy.h>
#include<pybind11/pybind11.h>
#include<pybind11/stl.h>
#include<vector>

using namespace std;
namespace py=pybind11;

class SimpleClass{
public:
double const_double;
void sum(vector<double> & in_arr, vector<double> & out_arr){
    for (int i = 0; i < in_arr.size();i++){
        out_arr[i] = in_arr[i] + const_double;
    }
}};

PYBIND11_MODULE(simple, m){
    py::class_<SimpleClass>(m, "SimpleClass")
    .def(py::init<>())
    .def_readwrite("dat",&SimpleClass::const_double)
    .def("sum_lambda",[](
        SimpleClass & sc,
        vector<double> & in_arr,
        vector<double> & out_arr
    ){
        // Convert out_arr to vector ? 
        sc.sum(in_arr, out_arr);
    });
}

Python End:

import simple
import numpy as np

sc = simple.SimpleClass()
in_arr = np.array([1.0, 2.0, 3.0])
out_arr = np.array([0.0, 0.0, 0.0])
sc.dat = 2.0

sc.sum_lambda(in_arr, out_arr)

# print(out_arr)
# array([0., 0., 0.])

当前我通过在sc.sum(in_arr,out_arr)之前创建空矢量来解决问题array_t out_arr。有更好的转换方法吗?

I have a simple C++ class that I want to expose to Python using Pybind11. Problem is that the void C++ function accepts std::vector & inputs, and pybind11::array_t are immutable. Therefore I do not get modified vector out.

example:
C++ program

#include<pybind11/numpy.h>
#include<pybind11/pybind11.h>
#include<pybind11/stl.h>
#include<vector>

using namespace std;
namespace py=pybind11;

class SimpleClass{
public:
double const_double;
void sum(vector<double> & in_arr, vector<double> & out_arr){
    for (int i = 0; i < in_arr.size();i++){
        out_arr[i] = in_arr[i] + const_double;
    }
}};

PYBIND11_MODULE(simple, m){
    py::class_<SimpleClass>(m, "SimpleClass")
    .def(py::init<>())
    .def_readwrite("dat",&SimpleClass::const_double)
    .def("sum_lambda",[](
        SimpleClass & sc,
        vector<double> & in_arr,
        vector<double> & out_arr
    ){
        // Convert out_arr to vector ? 
        sc.sum(in_arr, out_arr);
    });
}

Python end:

import simple
import numpy as np

sc = simple.SimpleClass()
in_arr = np.array([1.0, 2.0, 3.0])
out_arr = np.array([0.0, 0.0, 0.0])
sc.dat = 2.0

sc.sum_lambda(in_arr, out_arr)

# print(out_arr)
# array([0., 0., 0.])

Currently I workaround by creating empty vector before the sc.sum(in_arr, out_arr); call and copying out_arr element by element, followed by copy back to array_t out_arr. Is there a better way to convert it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文