SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
NumPy & SciPy 入門
Contents


NumPy & Scipy の機能紹介
  → ndarrayクラスの操作を中心に説明
NumPy & SciPy を使ったプログラミング
  → 線形回帰、 主成分分析, K-Means
  → Pythonの特徴であるOOPも取り入れる

ndarrayのviewと参照渡し
Contents


NumPy & Scipy の機能紹介
  → ndarrayクラスの操作を中心に説明
NumPy & SciPy を使ったプログラミング
  → 線形回帰、 主成分分析, K-Means
  → Pythonの特徴であるOOPも取り入れる

ndarrayのviewと参照渡し
What is NumPy/SciPy?
Pythonで数値計算

 数値計算 ≒ 繰り返し作業、ループ
    Pyhton : ループが遅い、その他諸々は書きやすい。
   C,Fortran : ループが速い、冗長な表現が多い。




  ループのある作業をC,Fortranで書き、
  それをpythonから呼べたら便利!
What is NumPy/SciPy?

NumPy
 ●   Cで実装されたndarray class
 ●   Universal Function
 ●   乱数の生成
 ●   f2pyによるFortranとの連携

SciPy
 ●   NumPyを元に様々な数値計算の関数の集合
 ●   BLAS/LAPACKを使った行列計算
 ●   FFT,クラスタリング、関数最適化 などなど
What is NumPy & SciPy?
numpy.ndarray class
 数値計算用のN次元配列

 Homogeneous N-dimensional Array
 各要素の型がすべて同じ → CやFortranの配列

 強力なインデクシング表現
 A[0:10, 3] etc

 Universal functionによる直感的な数式の表現
 y[:] = 3.0 * np.sin(x[:]) + x[:]**2 + e[0,:] etc
ndarray class

ndarrayの生成

✔np.array : listなどをndarrayに変換
✔np.empty : 任意のサイズを確保,Cのmalloc相当
✔np.zeros : 0で初期化,Cのcalloc相当
✔np.ones : 1で初期化
✔np.identity : 単位行列 etc
ndarray class

ndarrayの属性

✔dtype : 各要素の型, float64 etc
✔ndim : 配列の次元
✔shape : 各次元の要素数のtuple
✔size : 1次元にした時の長さ
✔data : 実際のデータがbuffer objectとして保持されている。
ndarray class
要素の参照、代入

✔個々の参照 : x[2], x[-1], A[1, 2], B[3, 2, 5]
✔スライスによる一括参照 : x[from:to:step]
  e.g.  x[2:6], x[::-1], A[1, :], A[::2, :6
✔1つの要素へ代入 : x[4] = 10.0
✔スライスを使った代入 : x[1:5] = 3.0,             A[0, 1:7] = x[0:6]
ndarray class
Universal Functions

配列のすべての要素に対して同じ操作を施す。 (elementwise operation)
基本的にFortran90の配列演算と同じ。
✔b[:] = 2.0 * a[:] + 1.0
✔B[:,:] = np.exp(A[:,:])
✔C[:,1:10] = B[:,3:12] + np.sin(B[:,:9])
✔D = C[:,1:10] * C[:,1:10] ← 行列積ではないので注意!
ndarray class
Broadcast : 配列形状の自動調整




        EuroScipy 2010, Python Scientific Notes より引用
ndarray class
Broadcastをうまく使うためのコツ
  np.newaxisを使って配列の次元を揃える
  ✔A[10,3] に x[3] を足す → A[:,:] + x[np.newaxis,:]

     for i in xrange(3):
         A[:,i] += x[i]

     相当の計算になる。(もちろんこれより速い。)

  ✔B[100,4,10] に y[4] を掛る
     → B[:,:,:] * y[np.newaxis,:,np.newaxis]

     for i in xrange(4):
         B[:,i,:] *= y[i]
ndarray class
Fancy Indexing
  ✔ixs = [0,2,2,4], x[ixs] → array(x[0],x[2],x[2],x[4])
  ✔np.where(x[:]>1) → 1より大きいxのインデックスの配列
  ✔np.where(x[:]>0,x,10) → xの0以上の要素をすべて10にする
  ✔mask = A[:,:] > 0
    → maskはbool型でAと同じshapeをもつndarray
    → A[mask]は0以上のAの要素が入った1D-ndarray
  ✔mask = np.sum(A[:,:]**2,1) < 0, inner_sphere = A[mask,:]
  → 球の内側のデータ
ndarray class
io関係
 ✔np.savetxt : ファイルにndarrayを書き込む
    np.savetxt(“data.log”,data)
 ✔np.loadtx : ファイルからndarrayに読み込む
    data = np.loadtxt(“data.log”)
 ✔PythonのbuiltinのPickleも使える
 大きいデータをバイナリで保存する際に便利
NumPyと 乱数
numpy.random
  ✔Mersenne Twisterによる乱数生成
  ✔rand : [0,1)上の一様乱数
  r = rand(100,3) → 一度に生成して配列に格納
  ✔randn : 標準正規乱数、randと同様に配列に格納もできる
  ✔dirichlet, normal, t, beta, poissson 他多数
  shapeを引数にとって配列に格納もできる。
  rand,randnとは書式が多少違うので注意!
NumPyの統計関数

✔np.max, np.min : 最大最小
✔np.argmax, np.argmin : 最大最小の位置
✔np.mean, np.var, np.std : 平均、分散、標準偏差
✔np.sort, np.argsort : 配列のソートとそのインデックス
これらは任意次元のndarrayとaxisを引数にとって任意の
軸に対して実行可

✔np.cov : 共分散,データは2D-ndarrayのみ
shapeは(ndim,nobs)の順なので注意!
NumPy/SciPyで行列計算
  np.dot (BLASのラッパー)
np.dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
例 x,y 1D-array, A,B 2D-array
    ●   dot(x,y) → スカラ, BLASの***dot相当
    ●   dot(A,x) → ベクター, BLASの***mv相当
    ●   dot(A,B) → 行列, BLASの***mm相当(dgemmとか)


  その他、 outer, tensordotとかもある
NumPy/SciPyで行列計算
scipy.linalg (LAPACKのラッパー)
  ●   det : 行列式
  ●   inv, pinv : 逆行列、 擬似逆行列
  ●   solve, lstsq : 連立方程式の解、最小自乗解
        Ax = b → x = solve(A,b)
  ●   eig, eigh, svd : (一般化)固有値分解、
                             特異値分解 (***ev,***gv,***svd)
        eig_val, eig_vec = eigh(A)
  ●   行列の因子分解
       lu, qr, cholesky etc
特殊関数
scipy.special
  ●ほとんどがUniversal Functionなのでndarrayを食わせると
   一気に計算してくれる。
  ●   gamma関数群 (分布関係でよく使う)
        gamma, gammaln, digamma
  ●   ベッセル関数、楕円関数など諸々 (あまりつかったことない...)
そ の他諸々
●   scipy.spatial : KD-treeとか距離計算とか
●   scipy.sparse : 疎行列とその線形代数
●   scipy.cluster : 階層/非階層クラスタリング
●   scipy.fftpack : Fourier変換
●   scipy.interpolate : スプライン補完とか
●   scipy.optimize : 関数最適化、非線形フィッティングとか
●   scipy.constants : 科学定数集
Matplotlib
とにもかくにも import matplotlib.pyplot as plt

   ●   plot(x, y ,[symb, label, linewidth]) : xとyをsymbでプロット
   ●   legend : labelを表示
   ●   xlabel, xlim, xtics : 軸の表示設定、yも同様
   ●   show : 画面にプロットの結果を表示
   ●   savefig : 画像ファイルにプロットを保存 (png, eps, svg, pdf)
便利なPythonのパッ ケ ージ
scikits.learn : NumPy&SciPyを使った機械学習のライブラリ
●



PyMC : MCMCによるベイズ推定
●



Networkx : グラフアルゴリズム
●



OpenOpt : 関数最適化 (Pythonインターフェイスあり)
●



OpenCV : 画像処理 (Pythonインターフェイスあり)
●



NLTK : 自然言語処理
●



pyMPI, PyCUDA : MPI, CUDAへのインターフェース
●



Biopython, PyMol, MODELLER : バイオインフォマティクス
●



pygresql, mysqldb, pysqlite2 : SQLへのインターフェイス
●



Universal Feed Parser : RSS, ATOMのパーサー
●




    PyPI <http://pypi.python.org/pypi> で欲しいパッケージを検索できる。
Contents


NumPy & Scipy の機能紹介
  → ndarrayクラスの操作を中心に説明
NumPy & SciPy を使ったプログラミング
  → 線形回帰、 主成分分析, K-Means
  → Pythonの特徴であるOOPも取り入れる

ndarrayのviewと参照渡し
NumPy & SciPy
      を 用いたプロ グラ ミ ン グ

                大原則
●極力ループにPythonのforではなく、NumPy対応する
関数を使う。(特にデータ数に対するループは厳禁!)
●   大抵の操作はあるのでよく探すこと!
●ホットスポットの検出にはPythonのプロファイラが便
利。
●   それでもやっぱり遅いよ! → f2py, Cythonなどを検討
NumPy & SciPy
    を 用いたプロ グラ ミ ン グ
Principal Component Analysis

 解き方 共分散行列の固有値分解 or データ行列の特異値分解



     実装方 (共分散行列版)
     1.np.covを使って共分散行列を計算
     2.scipy.linalg.eighを使って固有値分解
     3.np.dotを使って射影


    詳細はソースコード(pca.py)を用いて説明
NumPy & SciPy
    を 用いたプロ グラ ミ ン グ
Least Square Fit

                            or



   解き方
               pseudo-inverse
実装方
a) scipy.linalg.svdをコール ← 一番低レベル
b) scipy.linalg.pinvをコール
c) scipy.linalg.lstsqをコール

詳細はソースコード(regression.py)のを用いて説明
NumPy & SciPy
    を 用いたプロ グラ ミ ン グ
K-Means (理論)



E-Step
●




M-Step
●
NumPy & SciPy
    を 用いたプロ グラ ミ ン グ
K-Means (実装)

E- step
●


各サンプルに対してlnPの計算 (二次形式、Mahalanobis距離)
→ scipy.spatial.distance.cdist
各サンプルに対してlnP最大のクラスタ番号を選ぶ
→ np.argmax
●M-step
c_n = c のサンプルの選択 → ndarrayのfancy indexing機能
平均、共分散の計算 → np.mean, np.cov

    詳細はソースコード(kmeans.py)のを用いて説明
Contents


NumPy & Scipy の機能紹介
  → ndarrayクラスの操作を中心に説明
NumPy & SciPy を使ったプログラミング
  → 線形回帰、 主成分分析, K-Means
  → Pythonの特徴であるOOPも取り入れる

ndarrayのviewと参照渡し
ndarrayと view

[1] A = array([[1,2,3],
               [4,5,6],
               [7,8,9]])
[2] B = A[0]
[3] B[0] = 10

A[0,0]の値は?
ndarrayと view

view : 同じメモリ領域を異なるndarrayオブジェクトで共有する機能
メモリを共有しているの配列の要素を変更すると、他の配列の対応
する値も変更される。 知らないとかなりハマる。 (体験談)
viewを返す表現、関数
A.view()
A[from:to] (スライス)
A.T, np.transpose(A) (転置)
A.reshape(shape), np.reshape(A,shape) (次元変換)
A.swapaxes(a,b), np.swapaxes(A,a,b) (軸の交換)
np.tile(A,(a,b,...)) (同じ配列を並べる。a,b.. = 1の時はもとのAとメモリを共有!)


A.baseで参照元の配列の内容を見れる。
ndarrayと view
同じメモリ領域を共有しているかを調べる方法
A.__array_interface__[“data”][0]
がメモリの領域を指しているのでこれを比較する

例
def isMemoryShared(a,b):
    mem_a = a.__array_interface__[“data”][0]
    mem_b = b.__array_interface__[“data”][0]
    return mem_a == mem_b


メモリを共有したくないときはnp.copyを使う
B = np.copy(A[1:3,:])
a = a + 1, a += 1
●a=a+1
実は一度コピーを作成するので初めと終わりの”a”は
メモリ上では全くの別物。
● a += 1
aのメモリ上のデータを直接変更している。
(In-place Operation)
●np.exp(a,out=a)
universal functionでoutを指定するとin-placeで計算


    a.__array_interface__[“data”][0]で確認してみる。
値渡し と 参照渡し
     C言語では値渡しと参照渡しを使い分けられる。


値渡し (call by value)   参照渡し (call by reference)

void f1(int x){       void f2(int *x){
  x = x + 1;            *x = *x + 1;
}                     }

→ f1の外ではxの値は元のまま。     → f2の外でもxの値は1増える。
値渡し と 参照渡し

Pythonでは基本は値渡し! だけど...

例外
●リストの要素を変更


●インスタンスのメンバーを変更


●ndarrayの要素を変更


●ndarrayをin-place operationで変更
値渡し と 参照渡し

 def npf1(x):
   # これはx自身が更新される
   x[0] = 1

 def npf2(x):     def npf3(x):
   # xは不変           # xは更新される
   x=x+1            x += 1



x.__array_interface__で確認! → mutate.py
まとめ

●   NumPyのndarrayクラスの特徴であるindexingとunivesal functio
    よって数式を直感的にコードに変換できる。
●   ScipyをはじめとしたNumPyを使ったパッケージや他のPythonパッ
    ケージをうまく利用するといろいろできそう。
●   Pythonの特徴であるOOPとNumPyの高速な数値計算がうまく融
    合してかなり効率的なプログラミングが可能。
●   ndarrayのviewの仕組みは知っておかないと意外とハマリやすい...
Thanx for Listening!

Mais conteúdo relacionado

Mais procurados

Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Seiya Tokui
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with PythonAtsushi Hayakawa
 
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜Kosaku Ono
 
2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習Motoya Wakiyama
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義するblackenedgold
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツShuyo Nakatani
 
111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッションShohei Hido
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 Kenta Oono
 
Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Makoto Kawano
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4Tomohiro Namba
 

Mais procurados (20)

Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
 
R高速化
R高速化R高速化
R高速化
 
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜
 
2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習2013.07.15 はじパタlt scikit-learnで始める機械学習
2013.07.15 はじパタlt scikit-learnで始める機械学習
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章Pythonデータ分析 第4回勉強会資料 12章
Pythonデータ分析 第4回勉強会資料 12章
 
研究生のためのC++ no.4
研究生のためのC++ no.4研究生のためのC++ no.4
研究生のためのC++ no.4
 

Destaque

エクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてエクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてHiroshi Shimizu
 
Raspberry Pi and Scientific Computing [SciPy 2012]
Raspberry Pi and Scientific Computing [SciPy 2012]Raspberry Pi and Scientific Computing [SciPy 2012]
Raspberry Pi and Scientific Computing [SciPy 2012]Samarth Shah
 
VBAで数値計算 10 逆行列と疑似逆行列
VBAで数値計算 10 逆行列と疑似逆行列VBAで数値計算 10 逆行列と疑似逆行列
VBAで数値計算 10 逆行列と疑似逆行列Katsuhiro Morishita
 
The Joy of SciPy
The Joy of SciPyThe Joy of SciPy
The Joy of SciPykammeyer
 
Scientific Computing with Python Webinar 9/18/2009:Curve Fitting
Scientific Computing with Python Webinar 9/18/2009:Curve FittingScientific Computing with Python Webinar 9/18/2009:Curve Fitting
Scientific Computing with Python Webinar 9/18/2009:Curve FittingEnthought, Inc.
 
今日からわかる!ソーシャルグラフ解析
今日からわかる!ソーシャルグラフ解析今日からわかる!ソーシャルグラフ解析
今日からわかる!ソーシャルグラフ解析Daichi Onodera
 
2部グラフとソーシャルネットワーク
2部グラフとソーシャルネットワーク2部グラフとソーシャルネットワーク
2部グラフとソーシャルネットワークHiroko Onari
 
2章グラフ理論スピード入門
2章グラフ理論スピード入門2章グラフ理論スピード入門
2章グラフ理論スピード入門Teruo Kawasaki
 
距離と分類の話
距離と分類の話距離と分類の話
距離と分類の話考司 小杉
 
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門Keiichiro Ono
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data scienceTakami Sato
 

Destaque (11)

エクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについてエクセルで統計分析 統計プログラムHADについて
エクセルで統計分析 統計プログラムHADについて
 
Raspberry Pi and Scientific Computing [SciPy 2012]
Raspberry Pi and Scientific Computing [SciPy 2012]Raspberry Pi and Scientific Computing [SciPy 2012]
Raspberry Pi and Scientific Computing [SciPy 2012]
 
VBAで数値計算 10 逆行列と疑似逆行列
VBAで数値計算 10 逆行列と疑似逆行列VBAで数値計算 10 逆行列と疑似逆行列
VBAで数値計算 10 逆行列と疑似逆行列
 
The Joy of SciPy
The Joy of SciPyThe Joy of SciPy
The Joy of SciPy
 
Scientific Computing with Python Webinar 9/18/2009:Curve Fitting
Scientific Computing with Python Webinar 9/18/2009:Curve FittingScientific Computing with Python Webinar 9/18/2009:Curve Fitting
Scientific Computing with Python Webinar 9/18/2009:Curve Fitting
 
今日からわかる!ソーシャルグラフ解析
今日からわかる!ソーシャルグラフ解析今日からわかる!ソーシャルグラフ解析
今日からわかる!ソーシャルグラフ解析
 
2部グラフとソーシャルネットワーク
2部グラフとソーシャルネットワーク2部グラフとソーシャルネットワーク
2部グラフとソーシャルネットワーク
 
2章グラフ理論スピード入門
2章グラフ理論スピード入門2章グラフ理論スピード入門
2章グラフ理論スピード入門
 
距離と分類の話
距離と分類の話距離と分類の話
距離と分類の話
 
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 

Semelhante a Introduction to NumPy & SciPy

Introduction to Chainer and CuPy
Introduction to Chainer and CuPyIntroduction to Chainer and CuPy
Introduction to Chainer and CuPyKenta Oono
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Etsuji Nakai
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装Ryosuke Okuta
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_distShohei Hido
 
PythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよPythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよTanaka Yuichi
 
Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208atmiya
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Kenta Oono
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算kunihikokaneko1
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Seiya Tokui
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Springanyakichi
 
PythonによるDeep Learningの実装
PythonによるDeep Learningの実装PythonによるDeep Learningの実装
PythonによるDeep Learningの実装Shinya Akiba
 
東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29西岡 賢一郎
 

Semelhante a Introduction to NumPy & SciPy (20)

Introduction to Chainer and CuPy
Introduction to Chainer and CuPyIntroduction to Chainer and CuPy
Introduction to Chainer and CuPy
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist110828 tokyo scipy1_hido_dist
110828 tokyo scipy1_hido_dist
 
PythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよPythonでDeepLearningを始めるよ
PythonでDeepLearningを始めるよ
 
Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208a
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
PFI Christmas seminar 2009
PFI Christmas seminar 2009PFI Christmas seminar 2009
PFI Christmas seminar 2009
 
Deep learning実装の基礎と実践
Deep learning実装の基礎と実践Deep learning実装の基礎と実践
Deep learning実装の基礎と実践
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
PythonによるDeep Learningの実装
PythonによるDeep Learningの実装PythonによるDeep Learningの実装
PythonによるDeep Learningの実装
 
東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29東大生向けデータ解析講座 第2回 2017/12/29
東大生向けデータ解析講座 第2回 2017/12/29
 

Último

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Último (8)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

Introduction to NumPy & SciPy

  • 1. NumPy & SciPy 入門
  • 2. Contents NumPy & Scipy の機能紹介 → ndarrayクラスの操作を中心に説明 NumPy & SciPy を使ったプログラミング → 線形回帰、 主成分分析, K-Means → Pythonの特徴であるOOPも取り入れる ndarrayのviewと参照渡し
  • 3. Contents NumPy & Scipy の機能紹介 → ndarrayクラスの操作を中心に説明 NumPy & SciPy を使ったプログラミング → 線形回帰、 主成分分析, K-Means → Pythonの特徴であるOOPも取り入れる ndarrayのviewと参照渡し
  • 4. What is NumPy/SciPy? Pythonで数値計算 数値計算 ≒ 繰り返し作業、ループ Pyhton : ループが遅い、その他諸々は書きやすい。 C,Fortran : ループが速い、冗長な表現が多い。 ループのある作業をC,Fortranで書き、 それをpythonから呼べたら便利!
  • 5. What is NumPy/SciPy? NumPy ● Cで実装されたndarray class ● Universal Function ● 乱数の生成 ● f2pyによるFortranとの連携 SciPy ● NumPyを元に様々な数値計算の関数の集合 ● BLAS/LAPACKを使った行列計算 ● FFT,クラスタリング、関数最適化 などなど
  • 6. What is NumPy & SciPy? numpy.ndarray class 数値計算用のN次元配列 Homogeneous N-dimensional Array 各要素の型がすべて同じ → CやFortranの配列 強力なインデクシング表現 A[0:10, 3] etc Universal functionによる直感的な数式の表現 y[:] = 3.0 * np.sin(x[:]) + x[:]**2 + e[0,:] etc
  • 7. ndarray class ndarrayの生成 ✔np.array : listなどをndarrayに変換 ✔np.empty : 任意のサイズを確保,Cのmalloc相当 ✔np.zeros : 0で初期化,Cのcalloc相当 ✔np.ones : 1で初期化 ✔np.identity : 単位行列 etc
  • 8. ndarray class ndarrayの属性 ✔dtype : 各要素の型, float64 etc ✔ndim : 配列の次元 ✔shape : 各次元の要素数のtuple ✔size : 1次元にした時の長さ ✔data : 実際のデータがbuffer objectとして保持されている。
  • 9. ndarray class 要素の参照、代入 ✔個々の参照 : x[2], x[-1], A[1, 2], B[3, 2, 5] ✔スライスによる一括参照 : x[from:to:step] e.g.  x[2:6], x[::-1], A[1, :], A[::2, :6 ✔1つの要素へ代入 : x[4] = 10.0 ✔スライスを使った代入 : x[1:5] = 3.0, A[0, 1:7] = x[0:6]
  • 10. ndarray class Universal Functions 配列のすべての要素に対して同じ操作を施す。 (elementwise operation) 基本的にFortran90の配列演算と同じ。 ✔b[:] = 2.0 * a[:] + 1.0 ✔B[:,:] = np.exp(A[:,:]) ✔C[:,1:10] = B[:,3:12] + np.sin(B[:,:9]) ✔D = C[:,1:10] * C[:,1:10] ← 行列積ではないので注意!
  • 11. ndarray class Broadcast : 配列形状の自動調整 EuroScipy 2010, Python Scientific Notes より引用
  • 12. ndarray class Broadcastをうまく使うためのコツ np.newaxisを使って配列の次元を揃える ✔A[10,3] に x[3] を足す → A[:,:] + x[np.newaxis,:] for i in xrange(3): A[:,i] += x[i] 相当の計算になる。(もちろんこれより速い。) ✔B[100,4,10] に y[4] を掛る → B[:,:,:] * y[np.newaxis,:,np.newaxis] for i in xrange(4): B[:,i,:] *= y[i]
  • 13. ndarray class Fancy Indexing ✔ixs = [0,2,2,4], x[ixs] → array(x[0],x[2],x[2],x[4]) ✔np.where(x[:]>1) → 1より大きいxのインデックスの配列 ✔np.where(x[:]>0,x,10) → xの0以上の要素をすべて10にする ✔mask = A[:,:] > 0 → maskはbool型でAと同じshapeをもつndarray → A[mask]は0以上のAの要素が入った1D-ndarray ✔mask = np.sum(A[:,:]**2,1) < 0, inner_sphere = A[mask,:] → 球の内側のデータ
  • 14. ndarray class io関係 ✔np.savetxt : ファイルにndarrayを書き込む np.savetxt(“data.log”,data) ✔np.loadtx : ファイルからndarrayに読み込む data = np.loadtxt(“data.log”) ✔PythonのbuiltinのPickleも使える 大きいデータをバイナリで保存する際に便利
  • 15. NumPyと 乱数 numpy.random ✔Mersenne Twisterによる乱数生成 ✔rand : [0,1)上の一様乱数 r = rand(100,3) → 一度に生成して配列に格納 ✔randn : 標準正規乱数、randと同様に配列に格納もできる ✔dirichlet, normal, t, beta, poissson 他多数 shapeを引数にとって配列に格納もできる。 rand,randnとは書式が多少違うので注意!
  • 16. NumPyの統計関数 ✔np.max, np.min : 最大最小 ✔np.argmax, np.argmin : 最大最小の位置 ✔np.mean, np.var, np.std : 平均、分散、標準偏差 ✔np.sort, np.argsort : 配列のソートとそのインデックス これらは任意次元のndarrayとaxisを引数にとって任意の 軸に対して実行可 ✔np.cov : 共分散,データは2D-ndarrayのみ shapeは(ndim,nobs)の順なので注意!
  • 17. NumPy/SciPyで行列計算 np.dot (BLASのラッパー) np.dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) 例 x,y 1D-array, A,B 2D-array ● dot(x,y) → スカラ, BLASの***dot相当 ● dot(A,x) → ベクター, BLASの***mv相当 ● dot(A,B) → 行列, BLASの***mm相当(dgemmとか) その他、 outer, tensordotとかもある
  • 18. NumPy/SciPyで行列計算 scipy.linalg (LAPACKのラッパー) ● det : 行列式 ● inv, pinv : 逆行列、 擬似逆行列 ● solve, lstsq : 連立方程式の解、最小自乗解 Ax = b → x = solve(A,b) ● eig, eigh, svd : (一般化)固有値分解、 特異値分解 (***ev,***gv,***svd) eig_val, eig_vec = eigh(A) ● 行列の因子分解 lu, qr, cholesky etc
  • 19. 特殊関数 scipy.special ●ほとんどがUniversal Functionなのでndarrayを食わせると 一気に計算してくれる。 ● gamma関数群 (分布関係でよく使う) gamma, gammaln, digamma ● ベッセル関数、楕円関数など諸々 (あまりつかったことない...)
  • 20. そ の他諸々 ● scipy.spatial : KD-treeとか距離計算とか ● scipy.sparse : 疎行列とその線形代数 ● scipy.cluster : 階層/非階層クラスタリング ● scipy.fftpack : Fourier変換 ● scipy.interpolate : スプライン補完とか ● scipy.optimize : 関数最適化、非線形フィッティングとか ● scipy.constants : 科学定数集
  • 21. Matplotlib とにもかくにも import matplotlib.pyplot as plt ● plot(x, y ,[symb, label, linewidth]) : xとyをsymbでプロット ● legend : labelを表示 ● xlabel, xlim, xtics : 軸の表示設定、yも同様 ● show : 画面にプロットの結果を表示 ● savefig : 画像ファイルにプロットを保存 (png, eps, svg, pdf)
  • 22. 便利なPythonのパッ ケ ージ scikits.learn : NumPy&SciPyを使った機械学習のライブラリ ● PyMC : MCMCによるベイズ推定 ● Networkx : グラフアルゴリズム ● OpenOpt : 関数最適化 (Pythonインターフェイスあり) ● OpenCV : 画像処理 (Pythonインターフェイスあり) ● NLTK : 自然言語処理 ● pyMPI, PyCUDA : MPI, CUDAへのインターフェース ● Biopython, PyMol, MODELLER : バイオインフォマティクス ● pygresql, mysqldb, pysqlite2 : SQLへのインターフェイス ● Universal Feed Parser : RSS, ATOMのパーサー ● PyPI <http://pypi.python.org/pypi> で欲しいパッケージを検索できる。
  • 23. Contents NumPy & Scipy の機能紹介 → ndarrayクラスの操作を中心に説明 NumPy & SciPy を使ったプログラミング → 線形回帰、 主成分分析, K-Means → Pythonの特徴であるOOPも取り入れる ndarrayのviewと参照渡し
  • 24. NumPy & SciPy を 用いたプロ グラ ミ ン グ 大原則 ●極力ループにPythonのforではなく、NumPy対応する 関数を使う。(特にデータ数に対するループは厳禁!) ● 大抵の操作はあるのでよく探すこと! ●ホットスポットの検出にはPythonのプロファイラが便 利。 ● それでもやっぱり遅いよ! → f2py, Cythonなどを検討
  • 25. NumPy & SciPy を 用いたプロ グラ ミ ン グ Principal Component Analysis 解き方 共分散行列の固有値分解 or データ行列の特異値分解 実装方 (共分散行列版) 1.np.covを使って共分散行列を計算 2.scipy.linalg.eighを使って固有値分解 3.np.dotを使って射影 詳細はソースコード(pca.py)を用いて説明
  • 26. NumPy & SciPy を 用いたプロ グラ ミ ン グ Least Square Fit or 解き方 pseudo-inverse 実装方 a) scipy.linalg.svdをコール ← 一番低レベル b) scipy.linalg.pinvをコール c) scipy.linalg.lstsqをコール 詳細はソースコード(regression.py)のを用いて説明
  • 27. NumPy & SciPy を 用いたプロ グラ ミ ン グ K-Means (理論) E-Step ● M-Step ●
  • 28. NumPy & SciPy を 用いたプロ グラ ミ ン グ K-Means (実装) E- step ● 各サンプルに対してlnPの計算 (二次形式、Mahalanobis距離) → scipy.spatial.distance.cdist 各サンプルに対してlnP最大のクラスタ番号を選ぶ → np.argmax ●M-step c_n = c のサンプルの選択 → ndarrayのfancy indexing機能 平均、共分散の計算 → np.mean, np.cov 詳細はソースコード(kmeans.py)のを用いて説明
  • 29. Contents NumPy & Scipy の機能紹介 → ndarrayクラスの操作を中心に説明 NumPy & SciPy を使ったプログラミング → 線形回帰、 主成分分析, K-Means → Pythonの特徴であるOOPも取り入れる ndarrayのviewと参照渡し
  • 30. ndarrayと view [1] A = array([[1,2,3], [4,5,6], [7,8,9]]) [2] B = A[0] [3] B[0] = 10 A[0,0]の値は?
  • 31. ndarrayと view view : 同じメモリ領域を異なるndarrayオブジェクトで共有する機能 メモリを共有しているの配列の要素を変更すると、他の配列の対応 する値も変更される。 知らないとかなりハマる。 (体験談) viewを返す表現、関数 A.view() A[from:to] (スライス) A.T, np.transpose(A) (転置) A.reshape(shape), np.reshape(A,shape) (次元変換) A.swapaxes(a,b), np.swapaxes(A,a,b) (軸の交換) np.tile(A,(a,b,...)) (同じ配列を並べる。a,b.. = 1の時はもとのAとメモリを共有!) A.baseで参照元の配列の内容を見れる。
  • 32. ndarrayと view 同じメモリ領域を共有しているかを調べる方法 A.__array_interface__[“data”][0] がメモリの領域を指しているのでこれを比較する 例 def isMemoryShared(a,b): mem_a = a.__array_interface__[“data”][0] mem_b = b.__array_interface__[“data”][0] return mem_a == mem_b メモリを共有したくないときはnp.copyを使う B = np.copy(A[1:3,:])
  • 33. a = a + 1, a += 1 ●a=a+1 実は一度コピーを作成するので初めと終わりの”a”は メモリ上では全くの別物。 ● a += 1 aのメモリ上のデータを直接変更している。 (In-place Operation) ●np.exp(a,out=a) universal functionでoutを指定するとin-placeで計算 a.__array_interface__[“data”][0]で確認してみる。
  • 34. 値渡し と 参照渡し C言語では値渡しと参照渡しを使い分けられる。 値渡し (call by value) 参照渡し (call by reference) void f1(int x){ void f2(int *x){ x = x + 1; *x = *x + 1; } } → f1の外ではxの値は元のまま。 → f2の外でもxの値は1増える。
  • 35. 値渡し と 参照渡し Pythonでは基本は値渡し! だけど... 例外 ●リストの要素を変更 ●インスタンスのメンバーを変更 ●ndarrayの要素を変更 ●ndarrayをin-place operationで変更
  • 36. 値渡し と 参照渡し def npf1(x): # これはx自身が更新される x[0] = 1 def npf2(x): def npf3(x): # xは不変 # xは更新される x=x+1 x += 1 x.__array_interface__で確認! → mutate.py
  • 37. まとめ ● NumPyのndarrayクラスの特徴であるindexingとunivesal functio よって数式を直感的にコードに変換できる。 ● ScipyをはじめとしたNumPyを使ったパッケージや他のPythonパッ ケージをうまく利用するといろいろできそう。 ● Pythonの特徴であるOOPとNumPyの高速な数値計算がうまく融 合してかなり効率的なプログラミングが可能。 ● ndarrayのviewの仕組みは知っておかないと意外とハマリやすい...