pybind11返回对象的numpy数组 使用pybd11 C++ ++和python 3,我们如何在C++实现中正确创建一个对象的数组(即Unicode字符串)并返回到Python?传递到pybind11::array()的底层数据数组的确切内存布局是什么?我们究竟需要如何管理内存,即删除/释放内存
请注意,这是必要的,因为我们希望在创建数据帧时将该字符串数组与其他POD数组一起使用。结果表明,有必要:pybind11返回对象的numpy数组 使用pybd11 C++ ++和python 3,我们如何在C++实现中正确创建一个对象的数组(即Unicode字符串)并返回到Python?传递到pybind11::array()的底层数据数组的确切内存布局是什么?我们究竟需要如何管理内存,即删除/释放内存,c++,numpy,pybind11,C++,Numpy,Pybind11,请注意,这是必要的,因为我们希望在创建数据帧时将该字符串数组与其他POD数组一起使用。结果表明,有必要: 创建PyObject指针数组,填充数组,即 auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API... pbuf[0] = <new object...> pbuf[1] = <new object...> etc. 我帮不上忙pybind11。但是numpy数组可以使用numpy
auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API...
pbuf[0] = <new object...>
pbuf[1] = <new object...>
etc.
我帮不上忙
pybind11
。但是numpy
数组可以使用numpy C API
函数创建。阵列布局基本相同,属性加上数据缓冲区。对于对象类型,数据缓冲区包含指向内存中其他位置对象的指针。使用unicode
dtype,缓冲区实际上包含字符串(填充到指定长度)。您可能需要学习numpy
文档。谢谢-似乎最好的方法是手动创建带有对象的缓冲区,然后找出pybind11如何管理与底层数组以及所有对象关联的内存…您是否还知道一种不需要freeWhenDone
的解决方案?我想,如果内存由pybind11 malloc'd,py::array可以使用正常的空闲时间。我能够让它工作而不泄漏的方法是使用一个胶囊。此外,当内部对象是python字符串时,我必须释放每个单独分配的对象。pybind11的较新版本可能还有其他解决方案。
py::capsule freeWhenDone(pbuf, [](void* pp) {
delete [] (PyObject*)pp; // or else properly free the pbuf memory
});
arr = py::array(py::dtype("object"),
shape, strides, pbuf, freeWhenDone);