【发布时间】:2016-09-02 02:15:31
【问题描述】:
我想对以下模板化 C++ 类进行 cythonize:
template <typname T>
class Fc2Par
{
public:
Fc2Par(std::string const& par_file)
~Fc2Par()
std::vector<Box<T>> convert_boxes(std::vector<Box<T>> const& boxes) const;
std::vector<Point<T>> convert_points(std::vector<Point<T>> const& points) const;
private:
PartitionMap<T> par_map;
PartitionRTree<T> par_idx;
};
实际上,T 只会是 [int, double]。 Box/Point 是附加的模板类,但我不确定是否要在 python 中公开它。要cythonize,我有以下内容,但我被困在某些领域。我想我可以为 T 使用融合类型?
cimport cython
from libcpp.vector cimport vector
from libcpp.string cimport string
my_fused_type = cython.fused_type(cython.int, cython.double)
cdef extern from 'Fc2Par.h':
cdef cppclass Fc2Par[T]
Fc2Par(string&) except +
vector[Box[T]] convert_boxes(vector[Box[T]]&)
vector[Point[T]] convert_points(vector[Point[T]]&)
cdef class PyFc2Par:
cdef Fc2Par* thisptr <-- should this be Fc2Par[my_fused_type]*?
def __cinit__(self, par_file):
self.thisptr = new Fc2Par[my_fused_type](par_file)
def __dealloc__(self)
del self.thisptr
def convert_boxes(self, boxes)
I'm not sure what to do here?
def convert_points(self, points)
This will be very similar to convert_boxes once I figure that out.
理想情况下,我想像这样在 python 中使用 API:
boxes_int = [(0,0,1,1), (0,0,2,2), ...]
boxes_float = [(0.0,0.0,1.0,1.0), (0.0,0.0,2.0,2.0), ...]
fc2par = PyFc2Par('foo.csv')
converted_int = fc2par.convert_boxes(boxes_int)
converted_float = fc2par.convert_boxes(boxes_float)
它们返回一个包含 xmin,xmax,ymin,ymax 的元组列表。
我的问题:
在这种情况下使用融合类型正确吗?
如果我获取一个元组列表,如何在 Cython 代码中将它们转换为 Box[T]/Point[T] 而不会在 Python 中公开这些类?得到结果后,我可以将其转换回元组列表并将其发回。即,convert_boxes 实现应该如何?
感谢您的帮助。
【问题讨论】: