如何使用非琐碎(POD)类的缓冲协议实现pybind11

时间:2019-05-10 22:01:11

标签: c++ pybind11

我刚刚了解了Python Buffer Protocol,我想利用它从numpy原始数据创建python C++数组。我可以直接使用pybind11或c ++ python lib,但不能使用其他绑定生成器= /

阅读pybind11 docs并对其进行实验,似乎我们可以轻松地从琐碎的C ++结构(例如std::vector<int>struct带有简单旧数据类型,例如intfloat等)。但是,将缓冲协议添加到更复杂的结构是不可能的或没有被很好地证明。对于我的用例,我将pybind一个std::vector<struct Sequence>,并将Sequence定义如下:

struct Sequence {
    std::vector<float> feature;
    std::vector<int> label;
}

一旦在C ++端实现了带有缓冲协议的python绑定,在Python端我就可以完成

for seq in vector_sequence:
   feature_data=numpy.array(seq.feature, copy=False)`
   label_data=numpy.array(seq.label, copy=False)`.

在上面的循环中,vector_sequence是C ++ std::vector<Sequence>的不透明绑定,seqSequence,其中包含我要用作输入的两个向量用于numpy数组,而无需将数据从C ++复制到Python。

有人知道pybind11或c ++ python lib支持吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我知道了!我了解到,如果我想防止复制np.nanSequence成员,而不是复制实际的feature类,则不必为label类实现协议缓冲区。整个。 示例:

Sequence

重要的是,我正在使用PYBIND11_MAKE_OPAQUE(std::vector<Sequence>); py::bind_vector<std::vector<int>>(m, "VectorInt", py::buffer_protocol()); py::bind_vector<std::vector<float>>(m, "VectorFloat", py::buffer_protocol()); py::class_<SequenceReader>(m, "SequenceReader").def("read_sequences", &SequenceReader::read_sequences, py::return_value_policy::take_ownership); pybind11/numpy.h来防止复制