Boost numpy 接口

若是要作一個文檔糟糕排行榜的話,對mxnet來講,會是一個好消息。由於他們有了墊背者——Boost,具體點是Boost.Python(其它子塊還沒怎麼用很差評)。實際上,對比起來看,mxnet的文檔能夠稱爲傑做。。。從原理,到函數說明,到例子;再看看這位,簡直就是xxxx。描述沒有,例子沒有,還要問原理?光是用在偵查怎麼編譯出來運行的工做,投入的腦細胞工做時均可以在兆億億億億億億億億億億億級別。多的不說,看看官方文檔的sht-style吧\weixiao(前方高能預警)。html

可是有什麼辦法,誰叫人家牛呀,罵完了還得接着幹。numpy接口幾乎就是我用python接口的惟一理由(否則就是在做死)。因此很關鍵,但這方面能找到的資料有些少(其餘人都是怎麼作的...)發現一個Boost.Python擴展版用以支持numpy,但後面發現已經在去年被廢棄了,說是合到了官方主線上(\tuxie),因而又只好跪求這官方文檔。
最終仍是沒期望上,處處拼接了一些,程序纔算運行上(也是碎了一地),放這吧。python

// test.cpp
#include<boost/python.hpp>
#include<boost/python/numeric.hpp>
#include<boost/python/tuple.hpp>
#include<iostream>
using namespace boost::python;
void test_array(numeric::array &y, float value)
{
  const tuple &shape= extract<tuple>(y.attr("shape"));
  int h = extract<int>(shape[0]);    // 這個接口看起來很實用 :)
  int w = extract<int>(shape[1]);
  for(int h_i=0;h_i<h;++h_i)
    for(int w_i=0;w_i<w;++w_i)
      y[make_tuple(h_i,w_i)]=h_i-w_i;
  y[make_tuple(0,0)] = value;
}
BOOST_PYTHON_MODULE(array_test)
{
  numeric::array::set_module_and_type("numpy", "ndarray");
  def("test",&test_array);
}
g++ test.cpp -o array_test.so -fPIC -shared -lboost_python -I /usr/include/python2.7

而後是python測試腳本ios

import numpy as np
import array_test

a=np.zeros((3,4))
array_test.test(a,-10.)
#>>> a
#array([[-10.,  -1.,  -2.,  -3.],
#       [  1.,   0.,  -1.,  -2.],
#       [  2.,   1.,   0.,  -1.]])

Sep 7, 2017

  1. 今天發現應該保存爲cpphpp編譯能夠成功,但import的時候會提示沒有找到初始化函數。
  2. 另外,BOOST_PYTHON_MODULE以前先用using namespace boost::python(我也不清楚,以前覺得是宏展開出問題了,但加了括號後發現仍沒有起做用——暫留)
相關文章
相關標籤/搜索