Upload
makoto-kawano
View
297
Download
4
Embed Size (px)
Citation preview
かわの まこと
Python for Data Analysis
12章のお話Advanced NumPy• ndarrayの構成
- ポインタ
- データタイプ
- 配列の型(タプル)
- 各次元において次の要素に移動するのに必要なバイト数
2
dtypeのヒエラルキーfloat16からfloat128まであったりする• 小数なのか整数なのか確認はだるい
- 親クラス:np.floatingやnp.integerを使う
- 親クラスの確認:np.mro()
3
配列の作り直しreshape• コピーせずに作り直せる
• 1次元でも多次元でもOK
ravel• reshapeの逆
• コピーしない
flatten• reshapeの逆
• コピーを返す4
C v.s. Fortran NumPyはメモリ上においてRやMATLABより扱いやすい
• row / column major order - メモリに置く時,行(列)でひとかたまりにする
• C言語は行
• Fortran言語は列
5
配列の連結と分割
r_, c_も便利
6
Function Description
concatenate 最も一般的な関数,配列を連結する
vstack, row_stack 行で連結する
hstack 列で連結する
column_stack 1次配列を2次配列にしてから列で連結する
dstack 深さで連結する
split 分割する
hsplit / vsplit / dsplit 行,列,深さで分割する
要素の繰り返しNumPyにはbroadcastingがあるからあまり使われない
• repeat - 要素を繰り返す
• tile - 配列を繰り返す
7
Fancy Indexing:take and puttakeとput
8
Broadcasting異なる型の配列で算術計算ができる
9
Broadcastingの応用わざわざ軸のことを考えるのはだるい• np.newaxis
魔法の言葉
10
universal function
11
Method Description
reduce(x) 次元圧縮しながら要素ごとに計算
accumulate(x) reduceの計算過程みたい
reduceat(x, bins) bins毎に計算してくれる
outer(x, y) 直積とおなじような感じ
universal functionのカスタムnumpy.frompyfunc• pythonオブジェクトを返すけど,不便
numpy.vectorize• 型推論の面で優秀
でもNumPyの関数を使ったほうが速い
12
構造体の配列C言語の構造体のように型が違うものをまとめられる• 辞書のようにも扱える
• SQLのカラムのようにも扱える
pandasのDataFrameとかに比べて
• Low-levelだから高速で効率よく読み書き出来たりする
• CやC++と同じように読み書きする
• numpy.lib.recfunctionsを使えばそれなりに色々できる13
ソートnumpy.ndarray.sortは書き換え
numpy.sortはコピー
[::-1]を使えば降順になる
14
いろいろなものでソートindirect sort• 例:生徒の名前を苗字じゃなくて名前でソートしたい
• argsort - ソートした時のインデックスを返す
• lexsort - 辞書的にソートしてくれる
15
ソートアルゴリズム
16
kind Speed Stable Work Space Worst-case
‘quicksort' 1 No 0 O(n2)
‘mergesort’ 2 Yes n / 2 O(nlogn)
‘heapsort’ 3 No 0 O(nlogn)
ソートした配列内検索numpy.searchsorted• ソートした配列内でどこに配置されるか教えてくれる
• もし値が等しい場合は左側(先)にくる
ヒストグラムにするときに便利• np.digitizeでできちゃったりもする
17
NumPyの行列MATLABやJulia, GAUSSに比べて文法は少し冗長的
• numpy.dotを使う必要がある
- yTXy = np.dot(y.T, np.dot(X, y) • NumPyのインデックスはちょっと特殊
numpy.matrixを使えばMATLABっぽく使える• でもオススメはしない(めったに使われないから)
• numpy.matrixを使ったらnumpy.asarrayに変換するべき18
配列の入出力Memory-mapped Files• 巨大なファイルを分割して読み込める
• memmap:インメモリー配列
• flushを使えば書き込みもできる
HDF5(PyTables / h5py)
• numpyと親和性が高い
• HDF(hierarchical data format)フォーマットで保存
• 数百GB,TBでもいける19
パフォーマンス向上ループと条件分岐を配列演算や2値配列演算に変える
可能な限りbroadcastingをつかう
スライスを使ったデータのコピーを避ける
ufuncsとufuncs methodsを活用
もしやり尽くしてもパフォーマンス向上しないなら,CかFortranかCythonを使う
20