铸造pybind11 :: array_t to Mutable std :: vector
我有一个简单的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论