ユーザの作った python object を C++ に渡す(3) | Chandler@Berlin

Chandler@Berlin

ベルリン在住

self.vertex_list へのアクセス方法.

今回は self.vertex_list へのアクセスである.これは, float の長さ 3 の numpy.array の list である.list の取り出し方は,http://shitohichiumaya.blogspot.com/2010/08/boostpython-how-to-pass-python-object.html  で dict の keylist として説明した.

list の要素の float の numpy.array の要素へのアクセスをどうするかは以下のようになっている.

void print_float32_3(boost::python::object const & float32_3_obj)
{
    // check sequence length is 3 or not.
    if(boost::python::len(float32_3_obj) != 3){
        std::string const objstr =
            boost::python::extract< std::string >(
                boost::python::str(float32_3_obj));
        std::cerr << "print_float32_3: arg is not a float[3] obj ["
                  << objstr << "]" << std::endl;
        return;
    }

    float vec[] = {0.0f, 0.0f, 0.0f};
    for(int i = 0; i < 3; ++i){
        vec[i] = boost::python::extract< float >(
            float32_3_obj.attr("__getitem__")(i));
    }
    std::cout << "float[3] = " << vec[0] << " " << vec[1] << " "
              << vec[2] << std::endl;
}


まずは,numpy.arrayは sequence なので boost::python::len() を使って,長さが 3 であるかどうかをチェックしている.その後に __getitem__ のattribute を通して各要素にアクセスしている.numpy.array にはnumpy.float64 が入っているが,extract< float > で要素にアクセスすることができる.

最後の int の array も同じ,と言いたいのだが,実は問題につきあたってしまったので,それは次回に回そう.