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++の通常のオブジェクトに変換する. (逆はある程度勝手にやってくれる?)