Étendre python en C ++ (Boost.NumPy)

Pourquoi lier des classes / fonctions C ++ à Python?

C ++ 11 est devenu très pratique. C'est encore plus pratique avec Boost. Mais python est plus facile à utiliser. Projets basés sur NumPy (SciPy, matplotlib, pandas, ...) Est très facile à utiliser et est maintenu sur une plate-forme commune et fonctionne raisonnablement rapidement. Dois-je utiliser C ++ ou me lier à Python? De plus, je ne suis pas parvenu à une conclusion, mais je vais résumer les informations pour la liaison pour le moment.

Comment lier?

Il y a deux problèmes.

L'une des raisons d'utiliser Python est d'utiliser des bibliothèques basées sur NumPy, donc Il doit pouvoir se convertir en ndarray de NumPy, etc.

La base est API C Python et [API NumPy C](http://docs.scipy.org/doc/ numpy / reference / c-api.html). Liez les fonctions et classes C ++ à Python via ces derniers. C ++ peut bien sûr appeler directement l'API C Python, Vous devez contrôler vous-même le nombre de références. C'est trop difficile à jouer, donc Boost.Python encapsule cette zone comme C ++. Le nombre de références est géré par le pointeur intelligent.

D'un autre côté, l'API NumPy C est différente de l'API Python C, donc Boost.Python lui-même n'inclut pas de wrapper pour l'API de NumPy. Donc, basé sur Boost.Python, une interface pour NumPy L'implémentation est Boost.NumPy. J'ai écrit qu'il se trouve actuellement dans le bac à sable Boost, Il semble que Sandbox n'ait pas fonctionné depuis que le développement de Boost lui-même a été transféré sur Github. Le développement se fait sur github. Je ne sais pas où je me situe en tant que Boost.

Install

git clone https://github.com/ndarray/Boost.NumPy
cd Boost.NumPy

Je partirai du principe que je l’ai fait.

document de construction

cd libs/numpy/doc
make

Vous pouvez voir le document en ouvrant libs / numpy / doc / _build / html / index.html comme

Installation par cmake

Détaillé dans le document ci-dessus (omis) Certaines modifications sont nécessaires pour compiler dans l'environnement python3.

Comment utiliser

Pour utiliser divers algorithmes SciPy Une fonction qui prend «numpy.ndarray» comme argument et renvoie le même «ndarray» est requise.

Créer ndarray, qui est le cœur de NumPy, en C ++

project/CMakeLists.txt
        numpy.cpp

numpy.cpp


#include "boost/numpy.hpp"

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

np::ndarray new_zero1(unsigned int N) {
  p::tuple shape = p::make_tuple(N);
  np::dtype dtype = np::dtype::get_builtin<double>();
  return np::zeros(shape, dtype);
}

BOOST_PYTHON_MODULE(mymodule) {
  Py_Initialize();
  np::initialize();

  p::def("new_zero", new_zero1);
}

Écrivez comme ça. C'est assez intuitif à écrire.

CMakeLists.txt


cmake_minimum_required(VERSION 2.8)
# set(CMAKE_VERBOSE_MAKEFILE 1)

find_package(Boost COMPONENTS python3 REQUIRED) # for python3
find_package(PythonLibs REQUIRED)
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

add_library(mymodule SHARED numpy.cpp)
target_link_libraries(mymodule ${Boost_LIBRARIES} ${PYTHON_LIBRARY} boost_numpy)
set_target_properties(mymodule PROPERTIES PREFIX "") #préfixe'lib'Omettre
cmake .
make

Cela créera mymodule.so. Si vous n'écrivez pas set_target_properties, ce sera libmymodule.so. Notez qu'il peut s'agir de BIBLIOTHÈQUES ou de BIBLIOTHÈQUES.

Utilisation plus détaillée la prochaine fois.

Recommended Posts

Étendre python en C ++ (Boost.NumPy)
Next Python en langage C
API C en Python 3
Tutoriel Boost.NumPy pour l'extension de Python en C ++ (pratique)
Recherche binaire en Python / C ++
ABC166 en Python A ~ C problème
Résoudre ABC036 A ~ C avec Python
Comment envelopper C en Python
Résoudre ABC037 A ~ C avec Python
Ecrire un test unitaire de langage C en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Résoudre ABC175 A, B, C avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Algorithme en Python (ABC 146 C Dichotomy
Implémenter le filtre FIR en langage Python et C
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Ecrire le fichier O_SYNC en C et Python
N-Gram en Python
Programmation avec Python
notes de python C ++
Plink en Python
Constante en Python
python, openFrameworks (c ++)
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Générer un langage C à partir d'une expression S avec Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Exécutez Python en C ++ sur Visual Studio 2017
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python