Übergeben Sie die Liste von Python an C ++ als Referenz in pybind11

Einführung

Mit pybind11, das Python und C ++ integrieren kann, Sie können eine Liste von Python über einen STL-Container an eine C ++ - Funktion übergeben.

[Externer Link: Ausführen von C ++ - Code aus Python mit 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)

Dies wird jedoch als Wert übergeben, sodass Sie ihn auf der C ++ - Seite zurückgeben müssen, um die aktualisierte Liste in Python zu verwenden.

Andererseits möchte ich bei Verwendung vorhandener C ++ - Assets den C ++ - Quellcode nicht so weit wie möglich ändern Möglicherweise möchten Sie keinen neuen Rückgabewert festlegen oder das Update neu schreiben.

Also, indem Sie Numpy anstelle einer Liste durchgehen Obwohl die Verwendung begrenzt ist, kann sie als Referenz übergeben werden, sodass wir sie weitergeben.

Grundsätzlich denke ich, dass es besser ist, "mutable_data" und "Eigen" zu verwenden, die in den folgenden Links erläutert werden. Davon abgesehen gibt es einen solchen Inhalt. Einführung in den externen Link pybind11 (3) NumPy-Zusammenarbeit Teil 1 Externer Link pybind11 Einführung (3) NumPy-Zusammenarbeit Teil 2

wichtiger Punkt

C ++ - Code

Definieren Sie die Funktion "update1 ()", um die Liste über den STL-Container zu übergeben, und die Funktion "update2 ()", um sie mit Numpy zu übergeben. Beide versuchen, den Wert des empfangenen Arrays auf 1.0 zu aktualisieren.

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");
}

Python-Code

Übergeben Sie die Liste "[1., 2., 3.]" an "update1", "update2", Ein Skript, das überprüft, wie sich die Liste nach dem Anwenden der einzelnen Funktionen ändert.

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)

Ergebnis

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

Sie können sehen, dass der Wert nicht mit "update1" und mit "update2" aktualisiert wird.

Wie im Referenzlink erläutert, wenn der Typ (diesmal doppelt) auf Python- und C ++ - Seite nicht übereinstimmt Bitte beachten Sie, dass es als Wert übergeben wird.

Recommended Posts

Übergeben Sie die Liste von Python an C ++ als Referenz in pybind11
Lesen Sie mit Python Zeile für Zeile aus der Datei
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Betten Sie einen Python-Interpreter mit pybind11 + cmake in eine C ++ - App ein
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Extrahieren Sie den Wert, der einem Wert am nächsten kommt, aus einem Listenelement in Python
Löse ABC163 A ~ C mit Python
Rufen Sie C von Python mit DragonFFI auf
Python / Machen Sie ein Diktat aus einer Liste.
Löse ABC168 A ~ C mit Python
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
[Python] Ein Memo zum Betreiben eines mit GBDK mit PyBoy erstellten ROM
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
So entfernen Sie Duplikate aus einer Python-Liste unter Beibehaltung der Reihenfolge.
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Übergeben Sie beim Ausführen einer Python-Shell von Electron mehrere Argumente, um Python auszuführen.
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Erweiterung von Python um C oder C ++ (wenn es mehrere Argumente gibt, wenn eine Liste von der Python-Seite übergeben wird)
Erstellen Sie mit Pybind11 eine Umgebung zum Ausführen von C ++ - Funktionen aus Python (für Benutzer von Windows- und Visual Studio-Code).
Senden Sie eine Nachricht von Slack an einen Python-Server
[Python] Listenverständnis Verschiedene Möglichkeiten zum Erstellen einer Liste
Führen Sie Python-Skripte in C # -GUI-Anwendungen aus
[Python] So zeigen Sie die Elemente der Liste nebeneinander an
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
Lesen einer CSV-Datei mit Python 2/3
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
So öffnen Sie einen Webbrowser über Python
Erstellen Sie ein C-Array aus einer Python> Excel-Tabelle
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Ich möchte ein Spiel mit Python machen
So generieren Sie ein Python-Objekt aus JSON
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Entscheide dich für einen Laborauftrag mit Python (Fiktion)
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Einfache Aufgabenliste, erstellt mit Python + Django
Python Amateur versucht die Liste zusammenzufassen ②
Wrap C ++ mit Cython zur Verwendung von Python
Fordern Sie AtCoder (ABC) 164 mit Python heraus! A ~ C Problem
Von der Python-Umgebungskonstruktion zur virtuellen Umgebungskonstruktion mit Anaconda
Ich möchte mit Python in eine Datei schreiben
Zubu Amateur will Python starten
Konvertieren Sie die Zeichenfolge mit Python in ein zeichenweises Listenformat
Extrahieren Sie mit Python Daten von einer Webseite
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Versuchen Sie, mit Talking Head Anime aus einem einzigen Bild zu verschönern [Python-Vorbereitung]
Holen Sie sich eine Liste der Artikel, die von Benutzern mit Python 3 Qiita API v2 veröffentlicht wurden
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen