es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    #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, pybind11::array_t<double>& results) { ... }
    }
    
    namespace py = pybind11;
    
    PYBIND11_MODULE(one_calculator, m) {
        // documentación opcional del 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);
    }
    

    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
    “`

Comments are closed.