背景
numpy っぽいコードを C++ でやりたい.
NumCpp つかいます. C++14 or later
ドキュメントは Doxygen で激しく見づらい...
利点としては svg など linalg 系もいくつか自前で用意されています(Eigen 非依存).
Boost を一部使っていますが NUMCPP_NO_USE_BOOST で使わないようにできます.
Boost はベッセル関数など特殊数学関数や Python interface で使っています.
(python interface については pybind11 を使うのもできる)
用例
頻度高いのは github README に一覧あります.
ndarray は二次元まで
NdArray とありますが, 対応は 2 次元まです.
独自のメソッドとして numCols(), numRows() などがあります.
各要素に処理を適用.
begin(), end() のイテレータを使ってもいけますが, nc::applyFunction もあります. ただ C++17 でも明示的な型指定しないとなぜかコンパイルできませんでした.
(引数の NdArray 変数の型から推論してくれそうであるが)
nc::NdArray<double> a = nc::linspace<double>(-10.0, 10.0, 100);
// テンプレート型の明示的指定が必要
nc::applyFuncion<double>(a, [](double v) { return v * v; });
中身は std::transform を使って実装しているので, ちょこっと書き換えて C++17 + parallel STL で処理するのも手かもしれません.
(明示的にマルチスレッド処理する numpy.vectorize 相当は無い)
ファイル入出力
text or binary でいけます.
ただ, binary は生データそのままなので, shape 情報などありません(2D のデータを書いて読み直すと 1D になってしまう). したがって python で生成した .npy を NumCpp で読むやその逆はできないです.
npy(npz) フォーマットを扱いたいときは cnpy などを使うとよいでしょう.
その他 Python とデータやりとりしたいとなると shape などの情報は JSON に書いてやりとりとか, でしょうかね.
計測
Timer があります.
Python binding
Boost or pybind11 で Python 用バインディングがありますが, ある程度自前でバインディングを書かないとだめかもです.