openFrameworksを使い始めました。
そうしたらC++からPythonを呼び出したくなってきた。
以下の記事を参考に、Boost.pythonをインストールしたのでその記録。
PythonからC++を呼び出してnumpyを使う - TadaoYamaokaの日記
Boost.PythonおよびBoost.NumpyをWindowsで使うまで | tatsyblog
環境
- Windows10
- VisualStudio2015
- Python 3.5.3 (c:\python35)
- Boost 1.66 (c:\boost_1_66_0)
Boostのインストール
TadaoYamaokaさんの記事の手順のとおり。完全に同じ。ビリーブ。
- ダウンロードしたBoostを解凍して適当に配置。
- Boost.pythonのビルドを有効にする。
- Boostをビルド。
C++からBoost.pythonを使う
今度はtatsyさんのコードを参考にした。
#include "stdafx.h" #define BOOST_PYTHON_STATIC_LIB #define BOOST_NUMPY_STATIC_LIB #include <Python.h> #include <boost/python.hpp> #include <boost/python/numpy.hpp> #include <iostream> namespace py = boost::python; namespace np = boost::python::numpy; int main() { Py_Initialize(); np::initialize(); // Matrix A py::tuple shapeA = py::make_tuple(2, 2); np::ndarray A = np::zeros(shapeA, np::dtype::get_builtin<double>()); A[0][0] = 1.0; A[0][1] = 2.0; A[1][0] = 3.0; A[1][1] = 4.0; // Vector b py::tuple shapeB = py::make_tuple(2); np::ndarray b = np::zeros(shapeB, np::dtype::get_builtin<double>()); b[0] = 3.0; b[1] = 7.0; // Prepare numpy.linalg.solve py::object solve = py::import("numpy").attr("linalg").attr("solve"); // Solve np::ndarray x = py::extract<np::ndarray>(solve(A, b)); int dims = x.shape(0); for (int i = 0; i < dims; i++) { std::cout << py::extract<double>(x[i]) << std::endl; } return 0; }
無事に動きました。
先輩ありがとうございます。