Pybind11:从C ++端创建并返回numpy数组

时间:2018-03-08 17:45:39

标签: python c++ pybind11

如何从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);
}

1 个答案:

答案 0 :(得分:4)

你的确很正确。下面有一个更好的解决方案。

#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
}