Pybind11:从 C++ 端创建并返回 numpy 数组
Posted
技术标签:
【中文标题】Pybind11:从 C++ 端创建并返回 numpy 数组【英文标题】:Pybind11: Create and return numpy array from C++ side 【发布时间】:2018-03-08 17:45:39 【问题描述】:如何从 C++ 端创建一个 numpy 数组并将其提供给 python?
我希望 Python 在 Python 不再使用返回的数组时进行清理。
C++ 端不会使用delete ret;
来释放new double[size];
分配的内存。
下列说法正确吗?
#include "pybind11/pybind11.h"
#include "pybind11/numpy.h"
namespace py = pybind11;
py::array_t<double> make_array(const py::ssize_t size)
double* ret = new double[size];
return py::array(size, ret);
PYBIND11_MODULE(my_module, m)
.def("make_array", &make_array,
py::return_value_policy::take_ownership);
【问题讨论】:
我必须使用 numpy 而不是 pybind11 的 eigen 接口,因为我使用的是结构化的 numpy 数组。 【参考方案1】:你说的很对。下面是一个更好的解决方案。
#include "pybind11/pybind11.h"
#include "pybind11/numpy.h"
namespace py = pybind11;
py::array_t<double> make_array(const py::ssize_t size)
// No pointer is passed, so NumPy will allocate the buffer
return py::array_t<double>(size);
PYBIND11_MODULE(my_module, m)
.def("make_array", &make_array,
py::return_value_policy::move); // Return policy can be left default, i.e. return_value_policy::automatic
【讨论】:
嗯。这不会复制吗?我正在检查py::array_t
是否有移动构造函数....这里似乎有一个:github.com/pybind/pybind11/blob/…
由于返回值优化和复制省略,肯定不会复制。
py::return_value_policy::move
的演员表在这里:github.com/pybind/pybind11/blob/… 谢谢。
真的很希望他们在官方文档中谈论这个......
py::array_t
是否初始化新分配的缓冲区?还是我们自己初始化?以上是关于Pybind11:从 C++ 端创建并返回 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章
python嵌入C++,函数返回shared_ptr(pybind11/boost_python)
使用 Python、C++ 和 pybind11 返回和传递原始 POD 指针(数组)