なるように、なる

徒然なつぶやき、備忘録です。

Boost.python/Boost.numpyを使いたい

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さんの記事の手順のとおり。完全に同じ。ビリーブ。

  1. ダウンロードしたBoostを解凍して適当に配置。
  2. Boost.pythonのビルドを有効にする。
  3. 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;
}

無事に動きました。
先輩ありがとうございます。