Prenez note de ce que vous avez fait au Groupe d'étude Sapporo C ++ Online Mokumokukai # 36.
Veuillez frapper un autre endroit. Fais de ton mieux.
À 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.
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.
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"])
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.
https://github.com/ignisan/boost_numpy_project/blob/master/to_eigen_map.hpp
Recommended Posts