Passer la liste de Python vers C ++ par référence dans pybind11

introduction

Avec pybind11, qui peut intégrer Python et C ++, Vous pouvez passer une liste de Python à une fonction C ++ via un conteneur STL.

[Lien externe: Comment exécuter du code C ++ à partir de Python à l'aide de pybind11](https://myenigma.hatenablog.com/entry/2016/12/17/075812#STL%E3%81%AE%E3%82% B3% E3% 83% B3% E3% 83% 86% E3% 83% 8A% E3% 81% AE% E3% 82% 84% E3% 82% 8A% E5% 8F% 96% E3% 82% 8A)

Cependant, cela est passé par valeur, vous devez donc le retourner du côté C ++ pour utiliser la liste mise à jour en Python.

D'un autre côté, lors de l'utilisation d'actifs C ++ existants, je ne souhaite pas modifier le code source C ++ autant que possible, donc Vous ne souhaiterez peut-être pas définir une nouvelle valeur de retour ou réécrire la mise à jour.

Donc, en passant par Numpy au lieu d'une liste Bien que l'utilisation soit limitée, elle peut être transmise par référence, nous allons donc la partager.

Fondamentalement, je pense qu'il est préférable d'utiliser «mutable_data» et «Eigen» expliqué dans les liens ci-dessous. En dehors de cela, il existe un contenu comme celui-ci. Introduction au lien externe pybind11 (3) coopération NumPy partie 1 Introduction au lien externe pybind11 (3) coopération NumPy partie 2

point important

Code C ++

Définissez la fonction ʻupdate1 () qui passe la liste via le conteneur STL et la fonction ʻupdate2 () qui est passée par Numpy. Les deux essaient de mettre à jour la valeur du tableau reçu à 1.0.

hoge.cpp


#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <vector>

namespace py = pybind11;

void update1(std::vector<double> &x)
{
    int i;
    for(i = 0; i < 3; i ++)
    {
        x[i] = 1.0;
    }
}

void update2(py::array_t<double> x)
{
    auto x_buf = x.request();
    double *x_ptr = (double *)x_buf.ptr;

    int i;
    for(i = 0; i < 3; i ++)
    {
        x_ptr[i] = 1.0;
    }
}

PYBIND11_MODULE(hoge, m)
{
    m.doc() = "hoge module";
    m.def("update1", &update1, "update1 function");
    m.def("update2", &update2, "update2 function");
}

Code Python

Passez la liste [1., 2., 3.] à ʻupdate1, ʻupdate2, Un script qui vérifie comment la liste change après l'application de chaque fonction.

test.py


import numpy as np
import hoge

x = [1., 2., 3.]

print(x)
hoge.update1(x)
print(x)

x = np.array(x)
hoge.update2(x)
print(x)

résultat

[1.0, 2.0, 3.0]
[1.0, 2.0, 3.0]
[1. 1. 1.]

Vous pouvez voir que la valeur n'est pas mise à jour avec ʻupdate1 et est mise à jour avec ʻupdate2.

Comme expliqué dans le lien de référence, si le type (double cette fois) ne correspond pas du côté Python et du côté C ++ Veuillez noter qu'il sera passé par valeur.

Recommended Posts

Passer la liste de Python vers C ++ par référence dans pybind11
Lire ligne par ligne à partir d'un fichier avec Python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
De l'achat d'un ordinateur à l'exécution d'un programme sur python
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Incorporer un interpréteur Python dans une application C ++ avec pybind11 + cmake
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
Extraire la valeur la plus proche d'une valeur à partir d'un élément de liste en Python
Résoudre ABC163 A ~ C avec Python
Appeler C depuis Python avec DragonFFI
python / Créer un dict à partir d'une liste.
Résoudre ABC168 A ~ C avec Python
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
Essayez d'extraire une chaîne de caractères d'une image avec Python3
[Python] Un mémo pour faire fonctionner une ROM créée avec GBDK avec PyBoy
J'ai essayé de créer une liste de nombres premiers avec python
Comment supprimer les doublons d'une liste Python tout en préservant l'ordre.
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
Lors de l'exécution d'un shell Python à partir d'Electron, transmettez plusieurs arguments pour exécuter Python.
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Extension de Python par C ou C ++ (lorsqu'il y a plusieurs arguments, lors du passage d'une liste du côté Python)
Créer un environnement pour exécuter des fonctions C ++ à partir de Python avec Pybind11 (pour les utilisateurs de Windows et Visual Studio Code)
Envoyer un message de Slack à un serveur Python
[Python] Compréhension de liste Différentes façons de créer une liste
Exécuter des scripts Python à partir d'applications C # GUI
[python] Comment afficher les éléments de la liste côte à côte
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
Comment ouvrir un navigateur Web à partir de python
Créer un tableau C à partir d'une feuille Python> Excel
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Comment générer un objet Python à partir de JSON
Essayez de créer un code de "décryptage" en Python
Décidez d'une mission de laboratoire avec Python (fiction)
Étapes pour créer un bot Twitter avec Python
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Essayez de créer un groupe de dièdre avec Python
Liste de tâches simple créée avec Python + Django
amateur python tente de résumer la liste ②
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Défiez AtCoder (ABC) 164 avec Python! Un problème ~ C
De la construction d'environnement Python à la construction d'environnement virtuel avec anaconda
Je veux écrire dans un fichier avec Python
Zubu amateur veut démarrer Python
Convertir une chaîne au format de liste caractère par caractère avec python
Extraire des données d'une page Web avec Python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Essayez d'embellir avec Talking Head Anime à partir d'une seule image [préparation python]
Obtenez une liste d'articles publiés par les utilisateurs avec Python 3 Qiita API v2
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques