[PYTHON] Tipps zum Bearbeiten von numpy.ndarray aus c ++ - Ich möchte einen Iterator verwenden -

Zweck

Mit boost.python und boost.numpy können Sie ganz einfach ein Python-Modul erstellen, das numpy.ndarray mit c ++ verarbeiten kann. Obwohl boost.numpy eine gut gemachte Bibliothek ist, hat es einige Unannehmlichkeiten beim Zugriff auf Daten, wie zum Beispiel die Unfähigkeit, Iteratoren zu verwenden. Machen Sie die Daten daher leicht zugänglich.

Hintergrund

Was ist numpy.ndarray

Es ist ein mehrdimensionales Array, das von numpy, einem der Python-Pakete, bereitgestellt wird. Ohne dies sind numerische Berechnungen in Python so weit verbreitet, dass dies unmöglich ist.

Was ist boost.numpy

Eine Bibliothek, mit der Sie numpy von c ++ aus bedienen können. Greifen Sie wie folgt auf die Daten zu.

namespace bp = boost::python;
namespace np = boost::numpy;

void func(np::ndarray &data2d) {
  //data2d ist i als zweidimensionales Array,Weisen Sie dem Element j 0 zu
  for (int i = 0; i < data2d.shape(0); ++i) {
    for (int j = 0; j < data2d.shape(1); ++j) {
      data2d[bp::make_tuple(i, j)] = 0.0;
    }
  }
}

Bedingungen für Tricks

Um diesen Trick anwenden zu können, müssen die folgenden Bedingungen erfüllt sein.

Ich denke, die erste Bedingung wird in vielen Fällen erfüllt sein. Auch die zweite sollte erfüllt sein, es sei denn, es handelt sich um eine Variable, die ursprünglich aus einem großen Array herausgeschnitten wurde.

Aktivieren Sie den Iterator

Verwenden Sie boost.multi_array_ref. Da numpy.ndarray ein mehrdimensionales Python-Array ist, verwendet c ++ auch die mehrdimensionale Array-Bibliothek. boost.multi_array_ref ist eine Version von boost.multi_array, die selbst keinen Speicher zuweist. Klicken Sie hier für eine detaillierte Erklärung von boost.multi_array. (boost :: multi_array --Kmonos.net) Übrigens gibt es auch eine Version, die nur boost.const_multi_array_ref lesen und nicht schreiben kann.

Konkretes Beispiel

void func(np:ndarray &data2d) {
  const std::array<int, 2> shape = {data2d.shape(0), data2d.shape(1)};
  boost::multi_array_ref<double, 2> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape);
  // i,Wrapper für j-Element[i][j]Kann mit aufgerufen werden, verwendet jedoch einen Iterator
  for (boost::multi_array_ref_double, 2>::subarray<1>::type &&sub : wrapper) {
    boost::fill(sub, 0.0);
  }
}

Dann können Sie so darauf zugreifen.

Die Verwendung von boost.multi_array_ref ist natürlich mit einem gewissen Aufwand verbunden. Es gibt auch eine Möglichkeit, Zeiger direkt zu bearbeiten (Boost.NumPy-Lernprogramm zum Erweitern von Python in C ++ (Übung)), jedoch mit etwas Aufwand. Ich möchte Sicherheitsmaßnahmen ergreifen, ohne mir darüber Sorgen zu machen.

Übrigens werden im obigen Beispiel boost :: multi_array_ref <double, 2> und ein Wrapper für ein zweidimensionales Array vorbereitet, da es leicht zu verstehen ist und eine Bedeutung für die Einführung hat.

const std::array<int, 1> shape = {data2d.shape(0) * data2d.shape(1)};
  boost::multi_array_ref<double, 1> wrapper(reinterpret_cast<double*>(data2d.get_data()), shape); 
boost::fill(wrapper, 0.0);

Auf diese Weise ist der Vorgang auf einmal abgeschlossen.

Schließlich

Schließlich kann man sich auch hier auf die Boost-Bibliothek verlassen. Wenn Sie einen anderen guten Weg kennen (Bibliothek außer boost.multi_array_ref, etwas, das boost.numpy ersetzt usw.), lassen Sie es uns bitte wissen.

Recommended Posts

Tipps zum Bearbeiten von numpy.ndarray aus c ++ - Ich möchte einen Iterator verwenden -
Ich möchte ein Glas aus Python verwenden
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 9 Verwendung aus der C-Sprache
Ich möchte Ceres Solver aus Python verwenden
Ich möchte C ++ - Code aus Python-Code erstellen!
Tipps zum Aufrufen von Python von C.
Ich möchte eine externe Bibliothek mit IBM Cloud-Funktionen verwenden
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Ich möchte Linux auf dem Mac verwenden
Ich möchte IPython Qt Console verwenden
Ich möchte ein Automatisierungsprogramm erstellen!
Eine Einführung in Python für C-Sprachprogrammierer
[Python] Ich war eine Stunde lang begeistert, als ich versuchte, die Listeneinschlussnotation zu verwenden
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte MATLAB feval mit Python verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte OREMO mit setParam sein!
Wickeln Sie C mit Cython für Python ein
Ich möchte Passungen aus meinem Kopf machen
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
Ich möchte ip vrf mit SONiC verwenden
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Wrap C ++ mit Cython zur Verwendung von Python
Ich möchte die Aktivierungsfunktion Mish verwenden
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte Bilder von Katzen von Instagram erkennen
Ich möchte mich mit Backpropagation (tf.custom_gradient) (Tensorflow) selbst verwenden.
Ich möchte Android-Apps auf Android entwickeln (Debug)
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte OpenJDK 11 mit Ubuntu Linux 18.04 LTS / 18.10 verwenden
Ich möchte R-Datensatz mit Python verwenden
[Für Anfänger] Ich möchte die Anzahl der Lernerfahrungen leicht verständlich erklären.
[Für diejenigen, die TPU verwenden möchten] Ich habe versucht, die Tensorflow Object Detection API 2 zu verwenden
Ich möchte ein englisches Papier aus dem PDF-Format kopieren und in die Google-Übersetzung einfügen
Ich möchte vorerst die Desktop-Umgebung von Ubuntu auf Android verwenden (Termux-Version)
Ich möchte vorerst Ubuntus Desktop-Umgebung auf Android verwenden (UserLAnd-Version)
Ich möchte nicht nach High Para suchen, da es sich um IQ1 handelt (wie man lightgbm_tuner verwendet).
[TensorFlow] Ich möchte die Indizierung für Ragged Tensor beherrschen
Ich möchte das neueste gcc verwenden, auch wenn ich keine Sudo-Berechtigungen habe! !!
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 4 Verwenden Sie die GUI
Ich möchte Geschenke auch für mich selbst austauschen! [Weihnachten Hackason]
Ich möchte vorerst Selen bewegen [für Mac]
Ich möchte viele Prozesse von Python aus starten
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich möchte eine ISO-8601-Zeichenfolge in japanische Zeit konvertieren
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
Verwenden Sie eine Skriptsprache für ein komfortables C ++ - Leben - OpenCV-Port Python zu C ++ -