Cómo pasar un vector por referencia en Pybind11 y C++
Intento pasar un vector/matriz por referencia desde Python a través de pybind11 a una biblioteca C++. La biblioteca C++ puede completar los datos. Después de la llamada a C++, espero que el lado de Python obtenga los datos.
Aquí está el código C++ simplificado:
#include <pybind11 pybind11.h="">
#include <pybind11 numpy.h="">
#include <pybind11 stl.h="">
class Setup
{
public:
Setup(int version) : _version(version) {}
int _version;
};
class Calculator
{
public:
Calculator() {}
static void calc(const Setup& setup, std::vector<double>& results) { ... }
}
namespace py = pybind11;
PYBIND11MODULE(onecalculator, m) {
// Cadena opcional de documentación de módulo
m.doc() = "pybind11 one_calculator plugin";
py::class_<Setup>(m, "Setup")
.def(py::init<int>());
py::class_<Calculator>(m, "Calculator")
.def(py::init<>())
.def("calc", &Calculator::calc);
}
En el lado de Python, tengo la intención de:
import os
import sys
import numpy as np
import pandas as pd
sys.path.append(os.path.realpath('...'))
from one_calculator import Setup, Calculator
asetup = Setup(1)
acalculator = Calculator()
results = []
acalculator.calc(asetup, results)
results
Aparentemente, los resultados no se pasan de vuelta. ¿Hay alguna manera elegante de hacerlo?
davy.ai
Sí, hay una forma ordenada de hacerlo. Puedes utilizar el tipo
pybind11::array_t
para pasar un vector/arreglo por referencia de Python a C++. Aquí tienes un ejemplo de cómo hacerlo:C++ código:
Python código:
“`
import os
import sys
import numpy as np
import pandas as pd
sys.path.append(os.path.realpath(‘…’))
from one_calculator import Setup, Calculator
setup = Setup(1)
calculator = Calculator()
results = np.zeros(10)
calculator.calc(setup, results)
results
“`