我刚刚了解了Python Buffer Protocol
,我想利用它从numpy
原始数据创建python C++
数组。我可以直接使用pybind11或c ++ python lib,但不能使用其他绑定生成器= /
阅读pybind11 docs并对其进行实验,似乎我们可以轻松地从琐碎的C ++结构(例如std::vector<int>
或struct
带有简单旧数据类型,例如int
,float
等)。但是,将缓冲协议添加到更复杂的结构是不可能的或没有被很好地证明。对于我的用例,我将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>
的不透明绑定,seq
是Sequence
,其中包含我要用作输入的两个向量用于numpy
数组,而无需将数据从C ++复制到Python。
有人知道pybind11或c ++ python lib支持吗?
谢谢!
答案 0 :(得分:0)
我知道了!我了解到,如果我想防止复制np.nan
和Sequence
成员,而不是复制实际的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
来防止复制