Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.

Cet article

Prenez note de ce que vous avez fait au Groupe d'étude Sapporo C ++ Online Mokumokukai # 36.

Comment installer

Veuillez frapper un autre endroit. Fais de ton mieux.

Choses à faire

À titre d'exemple simple, la somme des tableaux à deux dimensions préparés par numpy en Python Il utilise la bibliothèque C ++ Eigen pour calculer, puis la renvoie à Python.

Code source C ++

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

Il peut être plus facile d'écrire si c'est juste dans le but d'ajouter des matrices, mais il est écrit de manière à pouvoir être appliqué. Il est inévitable que le type soit limité à «double». La seule façon de le faire est de vérifier «dtype» et de branchement, mais il n'y a pas d'autre choix que de juger au moment de l'exécution.

Comment compiler

Je vais le faire avec SCons. Par exemple, comme ça. Je le fais dans un environnement mingw.

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"])

Code Python

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)

Le résultat est Puisque «[[6,8], [5,7]]» et «[[5,6], [4,5]]» sont ajoutés

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

Ce sera. Le temps de réunion nuageux a également expiré ici.

Postscript

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

Recommended Posts

Rendre la bibliothèque créée par Eigen of C ++ disponible à partir de Python avec Boost.Numpy.
Rendre OpenCV3 disponible à partir de python3 installé avec pyenv
Faire un point d'arrêt sur la couche c avec python
Étendre python en C ++ (Boost.NumPy)
Rendre MeCab disponible à partir de Python 3
Rendre Opencv disponible en Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
Transmettez les données OpenCV de la bibliothèque C ++ d'origine à Python
Appeler C depuis Python avec DragonFFI
Activer le moteur d'analyse morphologique MeCab en Python3 (version mars 2016)
Lisez le fichier en Python avec un chemin relatif depuis le programme
Passer la liste de Python vers C ++ par référence dans pybind11
python> lien> from __future__ import print_function> Autoriser Python 3.X print () à être utilisé dans Python 2.X
Remplissez la chaîne avec des zéros en python et comptez certains caractères de la chaîne
Un mémo organisé en renommant les noms de fichiers dans le dossier avec python
Afficher Python 3 dans le navigateur avec MAMP
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
Générer un langage C à partir d'une expression S avec Python
Utilisation des fonctions C ++ de python avec pybind11
[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio
Affichage des données d'informations de position en Python --Essayez de tracer avec la bibliothèque d'affichage de carte (folium) -
[Python] Récupérez les fichiers dans le dossier avec Python
La première application Web créée par des débutants en Python
[Automation] Extraire le tableau en PDF avec Python
Copiez la liste en Python
Envelopper C avec Cython pour une utilisation à partir de Python
Tutoriel Boost.NumPy pour l'extension de Python en C ++ (pratique)
Gérez bien AWS avec la bibliothèque Python Boto
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Je veux créer du code C ++ à partir de code Python!
Lire ligne par ligne à partir d'un fichier avec Python
Convertir JSON en CSV avec Python de Splunk
Utilisez l'application LibreOffice en Python (3) Ajouter une bibliothèque
Inscription auprès de PyPI à partir de la bibliothèque Python moderne faite par vous-même
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Préparation
Faisons un saut dans l'industrie manufacturière en utilisant le Web en plus de Python
Créez Fatjar en changeant la classe principale avec Gradle
Apprenez Nim avec Python (dès le début de l'année).
Complétez la bibliothèque mise en anaconda avec jedi-vim
Expliquez en détail comment créer un son avec python
[Python] Obtenez les nombres dans l'image graphique avec OCR
[Python] Spécifiez la plage de l'image en faisant glisser la souris
Appelons votre propre bibliothèque C ++ avec Python (Préférences)
Affiche l'heure à partir du moment où le programme a été lancé en python
J'ai posé le problème de la séquence tribonatch en C ++ et le nombre d'appels de fonction lors de l'écriture avec une fonction de récurrence (python est également disponible)
Créez un Slackbot simple avec un bouton interactif en python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
Points Python du point de vue d'un programmeur en langage C
Explorez l'URL contenue dans le tweet Twitter avec python
Convertissez l'image au format .zip en PDF avec Python
Je voulais utiliser la bibliothèque Python de MATLAB
Obtenez des résultats au format dict avec Python psycopg2