假设我有一个SWIG包装类来处理指向某些数据的指针,如下面的代码所示。我想从数据构造一个numpy ndarray
对象并将其返回给用户。我希望它使用数据作为缓冲区但不取得所有权。如果我是对的,我将使用numpy C ++ api PyArray_SimpleNewFromData
。但是,我的问题是如何将其返回到python?如果我编写以下get
函数,SWIG会自动将其作为python对象返回吗?如果没有,我该怎么办?
class Test {
public:
Test () { ptr_ = new uint8_t[200]; }
~Test() { delete [] ptr_; }
PyObject* get() {
npy_intp dims[1] = {25};
return PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, ptr_);
}
private:
uint8_t* ptr_;
};
顺便说一句,我也在努力寻找上述api的头文件和库文件。如果你知道的话也请告诉我。感谢。
更新:
我试过SWIG包装这个类。其他一切都很好,除非我在python中调用get
函数(如下所示),我得到了分段错误。任何帮助表示赞赏。
x = Test()
y = x.get()
更新2:
似乎PyArray_SimpleNewFromData
是一个已弃用的函数。那么这仍然是支持还是还有其他更推荐的方法吗?
答案 0 :(得分:0)
我在swig中找到了使用typemap的解决方案:
%typemap(out) double* {
npy_intp dims[1] = {25};
$result = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, $1);
}
class Test {
public:
Test () { ptr_ = new uint8_t[200]; }
~Test() { delete [] ptr_; }
double* get() {
return (double*) ptr_;
}
private:
uint8_t* ptr_;
};