Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.

Dieser Beitrag

Notieren Sie sich, was Sie in der Sapporo C ++ - Studiengruppe Online Mokumokukai # 36 getan haben.

Wie installiert man

Bitte schlagen Sie einen anderen Ort. Gib dein Bestes.

Dinge die zu tun sind

Als einfaches Beispiel die Summe der zweidimensionalen Arrays, die von numpy in Python erstellt wurden Es verwendet die C ++ Eigenbibliothek zur Berechnung und gibt sie dann an Python zurück.

C ++ - Quellcode

cpplib.cpp


#define EIGEN_DEFAULT_TO_ROW_MAJOR
#include<Eigen/Core>
#include<boost/numpy.hpp>
namespace py = boost::python;
namespace np = boost::numpy;

np::ndarray add_double(const np::ndarray lhs, const np::ndarray rhs) {
    using Stride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
    const auto
        lrows = lhs.shape(0),
        lcols = lhs.shape(1),
        rrows = rhs.shape(0),
        rcols = rhs.shape(1);

    const Stride
        lstride(lhs.strides(0)/sizeof(double), lhs.strides(1)/sizeof(double)),
        rstride(rhs.strides(0)/sizeof(double), rhs.strides(1)/sizeof(double));

    const Eigen::Map<const Eigen::MatrixXd, Eigen::Unaligned, Stride>
        lmat(reinterpret_cast<double*>(lhs.get_data()), lrows, lcols, lstride),
        rmat(reinterpret_cast<double*>(rhs.get_data()), rrows, rcols, rstride);

    np::ndarray ret = np::empty(
        py::make_tuple(lmat.rows(),lmat.cols()), 
        np::dtype::get_builtin<double>());

    Eigen::Map<Eigen::MatrixXd>
        ret_mat(reinterpret_cast<double*>(ret.get_data()), lmat.rows(), lmat.cols());

    ret_mat = lmat + rmat;
    return ret;
}

BOOST_PYTHON_MODULE(cpplib) {
    Py_Initialize();
    np::initialize();
    py::def("add_double",add_double); 
}

Es ist möglicherweise einfacher zu schreiben, wenn es nur zum Hinzufügen von Matrizen dient, aber es ist so geschrieben, dass es angewendet werden kann. Es ist unvermeidlich, dass der Typ auf "double" beschränkt ist. Die einzige Möglichkeit, dies zu tun, besteht darin, "dtype" und "branch" zu überprüfen, aber es bleibt keine andere Wahl, als zur Laufzeit zu urteilen.

Wie zu kompilieren

Ich werde es mit SCons machen. Zum Beispiel so. Ich mache es in einer Mingw-Umgebung.

SConstruct


# vim: filetype=python
# SConstruct

env = Environment(
    SHLIBPREFIX="",
    SHLIBSUFFIX=".pyd",
    CXX="/mingw64/bin/g++",
    CXXFLAGS=["-std=c++14"],
    LINKFLAGS=["-std=c++14"],
    CPPPATH=[
        "/mingw64/include/eigen3",
        "/mingw64/include/python3.5m", ],
    LIBPATH=["/mingw64/lib"])

env.SharedLibrary("cpplib", ["cpplib.cpp"],
    LIBS=["boost_numpy", "python3.5.dll", "boost_python3-mt"])

Python-Code

usecpp.py


import numpy as np
from cpplib import add_double

a = np.array(
    [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 1, 2, 3],
     [4, 5, 6, 7], ], dtype=np.float64)
b = np.array(
    [[5, 6],
     [4, 5], ], dtype=np.float64)

result = add_double(a[1::2, 1::2], b[::1, ::1])
print(result)

Ergebnis ist Da "[[6,8], [5,7]]" und "[[5,6], [4,5]]" hinzugefügt werden

$ python3 usecpp.py
[[ 11.  14.]
 [  9.  12.]]

Es wird sein. Auch hier ist die bewölkte Besprechungszeit abgelaufen.

Nachtrag

https://github.com/ignisan/boost_numpy_project/blob/master/to_eigen_map.hpp

Recommended Posts

Stellen Sie die von Eigen of C ++ erstellte Bibliothek mit Boost.Numpy in Python zur Verfügung.
Stellen Sie OpenCV3 in Python3 zur Verfügung, das mit pyenv installiert wurde
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Erweitern Sie Python in C ++ (Boost.NumPy)
Stellen Sie MeCab in Python 3 zur Verfügung
Stellen Sie Opencv in Python zur Verfügung
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Rufen Sie C von Python mit DragonFFI auf
Aktivieren Sie die morphologische Analyse-Engine MeCab in Python 3 (Version März 2016).
Lesen Sie die Datei in Python mit einem relativen Pfad aus dem Programm
Übergeben Sie die Liste von Python an C ++ als Referenz in pybind11
python> link> from __future__ import print_function> Erlaube die Verwendung von Python 3.X print () in Python 2.X.
Füllen Sie die Zeichenfolge mit Nullen in Python und zählen Sie bestimmte Zeichen aus der Zeichenfolge
Ein Memo, das durch Umbenennen der Dateinamen im Ordner mit Python organisiert wird
Zeigen Sie Python 3 im Browser mit MAMP an
Was ist "Mahjong" in der Python-Bibliothek? ??
Lesen Sie die Datei Zeile für Zeile mit Python
Lesen Sie die Datei Zeile für Zeile mit Python
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Verwenden von C ++ - Funktionen aus Python mit pybind11
[Python] Erstellt eine Klasse, um mit pyaudio Sinuswellen im Hintergrund zu spielen
Anzeige von Positionsinformationsdaten in Python - Versuchen Sie, mit der Kartenanzeigebibliothek (Folium) zu zeichnen -
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Die erste Web-App, die von Python-Anfängern erstellt wurde
[Automatisierung] Extrahieren Sie die Tabelle als PDF mit Python
Kopieren Sie die Liste in Python
Wickeln Sie C mit Cython für Python ein
Boost.NumPy Tutorial zum Erweitern von Python in C ++ (Übung)
Verwalten Sie AWS mit der Python-Bibliothek Boto
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Wrap C ++ mit Cython zur Verwendung von Python
Ich möchte C ++ - Code aus Python-Code erstellen!
Lesen Sie mit Python Zeile für Zeile aus der Datei
Konvertieren Sie JSON mit Python von Splunk in CSV
Verwenden Sie die LibreOffice-App in Python (3) Bibliothek hinzufügen
Registrierung bei PyPI aus einer modernen Python-Bibliothek selbst erstellt
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
Machen wir einen Sprung in die Fertigungsindustrie, indem wir zusätzlich zu Python das Web nutzen
Mache Fatjar, indem du die Hauptklasse mit Gradle wechselst
Lerne Nim mit Python (ab Anfang des Jahres).
Ergänzen Sie die Bibliothek in Anakonda mit jedi-vim
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR
[Python] Geben Sie den Bereich des Bildes durch Ziehen der Maus an
Rufen wir Ihre eigene C ++ - Bibliothek mit Python auf (Einstellungen)
Geben Sie die Zeit ab dem Start des Programms in Python aus
Ich habe nach dem Problem der Tribonatch-Sequenz in C ++ und der Anzahl der Funktionsaufrufe beim Schreiben mit einer Wiederholungsfunktion gefragt (Python ist ebenfalls verfügbar).
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Crawlen Sie die im Twitter-Tweet enthaltene URL mit Python
Konvertieren Sie das Bild in .zip mit Python in PDF
Ich wollte die Python-Bibliothek von MATLAB verwenden
Mit Python psycopg2 erhalten Sie Ergebnisse im Diktatformat