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 数组的主要内容,如果未能解决你的问题,请参考以下文章

pybind11 返回 numpy 对象数组

python嵌入C++,函数返回shared_ptr(pybind11/boost_python)

使用 Python、C++ 和 pybind11 返回和传递原始 POD 指针(数组)

Pybind11 用于 C++ 代码,内部结构通过静态工厂方法创建

Pybind11:外部类型作为返回值

从 python 传递到 C++ 的数组中未映射的内存访问