Pythonデータ分析 第4回勉強会資料 12章

20
かわの まこと Python for Data Analysis

Transcript of Pythonデータ分析 第4回勉強会資料 12章

Page 1: Pythonデータ分析 第4回勉強会資料 12章

かわの まこと

Python for Data Analysis

Page 2: Pythonデータ分析 第4回勉強会資料 12章

12章のお話Advanced NumPy• ndarrayの構成

- ポインタ

- データタイプ

- 配列の型(タプル)

- 各次元において次の要素に移動するのに必要なバイト数

2

Page 3: Pythonデータ分析 第4回勉強会資料 12章

dtypeのヒエラルキーfloat16からfloat128まであったりする• 小数なのか整数なのか確認はだるい

- 親クラス:np.floatingやnp.integerを使う

- 親クラスの確認:np.mro()

3

Page 4: Pythonデータ分析 第4回勉強会資料 12章

配列の作り直しreshape• コピーせずに作り直せる

• 1次元でも多次元でもOK

ravel• reshapeの逆

• コピーしない

flatten• reshapeの逆

• コピーを返す4

Page 5: Pythonデータ分析 第4回勉強会資料 12章

C v.s. Fortran NumPyはメモリ上においてRやMATLABより扱いやすい

• row / column major order - メモリに置く時,行(列)でひとかたまりにする

• C言語は行

• Fortran言語は列

5

Page 6: Pythonデータ分析 第4回勉強会資料 12章

配列の連結と分割

r_, c_も便利

6

Function Description

concatenate 最も一般的な関数,配列を連結する

vstack, row_stack 行で連結する

hstack 列で連結する

column_stack 1次配列を2次配列にしてから列で連結する

dstack 深さで連結する

split 分割する

hsplit / vsplit / dsplit 行,列,深さで分割する

Page 7: Pythonデータ分析 第4回勉強会資料 12章

要素の繰り返しNumPyにはbroadcastingがあるからあまり使われない

• repeat - 要素を繰り返す

• tile - 配列を繰り返す

7

Page 8: Pythonデータ分析 第4回勉強会資料 12章

Fancy Indexing:take and puttakeとput

8

Page 9: Pythonデータ分析 第4回勉強会資料 12章

Broadcasting異なる型の配列で算術計算ができる

9

Page 10: Pythonデータ分析 第4回勉強会資料 12章

Broadcastingの応用わざわざ軸のことを考えるのはだるい• np.newaxis

魔法の言葉

10

Page 11: Pythonデータ分析 第4回勉強会資料 12章

universal function

11

Method Description

reduce(x) 次元圧縮しながら要素ごとに計算

accumulate(x) reduceの計算過程みたい

reduceat(x, bins) bins毎に計算してくれる

outer(x, y) 直積とおなじような感じ

Page 12: Pythonデータ分析 第4回勉強会資料 12章

universal functionのカスタムnumpy.frompyfunc• pythonオブジェクトを返すけど,不便

numpy.vectorize• 型推論の面で優秀

でもNumPyの関数を使ったほうが速い

12

Page 13: Pythonデータ分析 第4回勉強会資料 12章

構造体の配列C言語の構造体のように型が違うものをまとめられる• 辞書のようにも扱える

• SQLのカラムのようにも扱える

pandasのDataFrameとかに比べて

• Low-levelだから高速で効率よく読み書き出来たりする

• CやC++と同じように読み書きする

• numpy.lib.recfunctionsを使えばそれなりに色々できる13

Page 14: Pythonデータ分析 第4回勉強会資料 12章

ソートnumpy.ndarray.sortは書き換え

numpy.sortはコピー

[::-1]を使えば降順になる

14

Page 15: Pythonデータ分析 第4回勉強会資料 12章

いろいろなものでソートindirect sort• 例:生徒の名前を苗字じゃなくて名前でソートしたい

• argsort - ソートした時のインデックスを返す

• lexsort - 辞書的にソートしてくれる

15

Page 16: Pythonデータ分析 第4回勉強会資料 12章

ソートアルゴリズム

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)

Page 17: Pythonデータ分析 第4回勉強会資料 12章

ソートした配列内検索numpy.searchsorted• ソートした配列内でどこに配置されるか教えてくれる

• もし値が等しい場合は左側(先)にくる

ヒストグラムにするときに便利• np.digitizeでできちゃったりもする

17

Page 18: Pythonデータ分析 第4回勉強会資料 12章

NumPyの行列MATLABやJulia, GAUSSに比べて文法は少し冗長的

• numpy.dotを使う必要がある

- yTXy = np.dot(y.T, np.dot(X, y) • NumPyのインデックスはちょっと特殊

numpy.matrixを使えばMATLABっぽく使える• でもオススメはしない(めったに使われないから)

• numpy.matrixを使ったらnumpy.asarrayに変換するべき18

Page 19: Pythonデータ分析 第4回勉強会資料 12章

配列の入出力Memory-mapped Files• 巨大なファイルを分割して読み込める

• memmap:インメモリー配列

• flushを使えば書き込みもできる

HDF5(PyTables / h5py)

• numpyと親和性が高い

• HDF(hierarchical data format)フォーマットで保存

• 数百GB,TBでもいける19

Page 20: Pythonデータ分析 第4回勉強会資料 12章

パフォーマンス向上ループと条件分岐を配列演算や2値配列演算に変える

可能な限りbroadcastingをつかう

スライスを使ったデータのコピーを避ける

ufuncsとufuncs methodsを活用

もしやり尽くしてもパフォーマンス向上しないなら,CかFortranかCythonを使う

20