のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

boost::python(6) pyublasを利用したnumpy.arrayとの連携方法

Sponsored Links

皆さんこんにちわ。
お元気ですか?私は眠いんです…。

本日も相変わらずBoost::pythonについて
特にPythonの科学技術計算ライブラリnumpyのarray型を扱ってみたいと思います。

C++

#include <Python.h>

#include <numpy/arrayobject.h>
#include <boost/python.hpp>
#include <pyublas/numpy.hpp>

using namespace std;
using namespace boost;
using namespace boost::python;

pyublas::numpy_matrix<double> doubles(pyublas::numpy_matrix<double> x)
{
  return 2*x;
}

pyublas::numpy_vector<double> triples(pyublas::numpy_vector<double> x)
{
  return 3*x;
}

BOOST_PYTHON_MODULE(numpy_array){
  def("doubles",&doubles);
  def("triples",&triples);
}

1次元のarray型を扱う場合はnumpy_vector
2次元のarray型を扱う場合はnumpy_matrixを使う。

Python

>>> import numpy_array
>>> import numpy
>>> import pyublas
>>> matrix = numpy.array([[2.1,4.0],[2.0,5.0]])
>>> vector = numpy.array([2.0,4.3,3.3])
>>> numpy_array.doubles(matrix)
array([[  4.2,   8. ],
       [  4. ,  10. ]])
>>> numpy_array.triples(vector)
array([  6. ,  12.9,   9.9])

特筆すべき点は
import でpyublasを使っていること。
これがないと動きません。

更に君のコードは加速する。boostだけにね…。
(遂にboost::pythonネタはなくなった気がする…。要望があればそれについてやりたいと思います。できる範囲で)