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