0
0

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.

numpy 機能を自前ライブラリで対応したい用の numpy ソースコードのメモ

Posted at

背景

  • 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)

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?