Boost.Python Tips

Boost Pythonで困ったところを適当にまとめる.

型の対応 (左がPython, 右がC++)

  • numpy.float32 ⇔ float
  • fload ⇔ double
  • 2次元array ⇔ pyublas::numpy_matrix
  • 1次元array ⇔ pyublas::numpy_vector (たぶん)
  • list ⇔ boost::python::list

numpy_matrixのインターフェイスはublasとあわせていると思われるので, 扱いはublasのMatrixの定義を見れば大体どう使えばいいかわかるはず.

リストなど一般的なオブジェクトを含む場合の扱い

boost::python::objectがおそらくC++側から見えているPythonの全てのオブジェクトの基底クラス.

typedef boost::python::list pylist;

pylist receive(pylist x)
{
  pylist y;
  int n = boost::python::len(x);

  for(int i = 0;i < n;i++){
    //boost::python::object obj = x.pop();
    boost::python::object obj = x[i];
    float c = boost::python::extract<float>(obj);
    y.append(c);
  }
  
  return y;
}

このように, extractメソッドを使ってC++の通常のオブジェクトに変換する. (逆はある程度勝手にやってくれる?)