背景
- numpy の機能を自前ライブラリ(e.g. C/C++)でも対応したい.
- 乱数や SVD とか
- スマホ(Android/iOS)に移植して動かしたいとか.
- numpy の一部機能を GPU(e.g. CUDA, OpenCL)で処理したい
- プロトタイプなどは numpy(CPU)で行い, 実戦では GPU で高速, 大規模処理したいとか
情報
概要
ndarray については調べれば他に記事ありますし, C/C++ で numpy っぽい ndarray ライブラリもいくつかありますので省きます.
linalg とか fft とかの話をします.
全部自前で実装しています(依存ライブラリなし).
ただ, 高速化用に third party library(e.g. Intel MKL)も利用できるようになっています.
また, 一部は python テンプレートとかから .c 生成などしています.
インターフェイスは python ですが, 処理が重たいような実装は C で処理しています.
native code 部分は全部 C です. C++ は利用されていません.
binding は, 基本は素の Python C API を呼んでいますが, random 関連は Cython を利用しています. したがって numpy のビルドには cython が必要になります.
基本, 依存ライブラリが無いため, ビルド自体は Linux では比較的簡単です. Ryzen9 3950X でだいたい 3~4 分でビルドできました.
Windows だとビルド面倒かもしれません.
linalg
線形代数ライブラリ. 実装は lapack lite(blas 付き)が標準であります(fortran から f2c で C に変換?).
コンパイルオプションで, 最適化 Blas/Lapack を使うことができるようになっています.
random
乱数. poisson 分布など自前で実装しています.
疑似乱数生成アルゴリズムは MT(Mersenne Twister)がデフォルトっぽそうですが, 最近はやりの PCG(pcg64) もあります.
fft
1.17 から pocketfft(fftpack をベースに numpy 用に自前最適化)が利用されています.
pocketfft 自体はポータブルなので, pocketfft だけ抜き出して利用もできます.
音声, 信号処理系ライブラリ nanosnap でも FFT には pocketfft を利用しています.
Masked array
numpy/lib/ma
にあります.
通常の ndarary とは実装が別のようです.
polynomial
多項式.
実装は pure Python のようです.
シリアライズ, デシリアライズ
numpy/lib/npyio
にあります. python レイヤーで処理しています.
pickle も利用できるようですが, 非推奨になっています.
einsum
T.B.W.
matrixlib
numpy/matrixlib
行列クラスですが, 最新 numpy ではもうあまり必要がないっぽい機能のようです.
umath(Universal math?)
最近では _multiarray_umath に変わっています.
ソースコードには特に記述がないのですが, umath = ufunc 形式の math(ufunc = universal function) = universal math っぽいようです.
基本的には配列などに一括して適用して処理を早くする感じです.
python のテンプレートから .c を吐いています.
昔は別パッケージだったようで, import error の原因にもなっています.
自前 ufunc
Writing your own ufunc
https://numpy.org/doc/stable/user/c-info.ufunc-tutorial.html
まとめ
fft や random あたりは移植や機能切り出し用意でしょうが, ufunc(umath) や Pure python な部分はめんどそうです(e.g. polynomial, einsum)