1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NumCpp のメモ

1
Last updated at Posted at 2021-10-05

背景

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 用バインディングがありますが, ある程度自前でバインディングを書かないとだめかもです.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?