Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Python: min, max, random, find

matlabでいうところのmin, max, rand, randn, findのやり方メモ on numpy.

 

最小(大)値を返す

min, maxです。方向はaxisで指定します。

これはmatlabと一致。

axis引数がないと単に一番小さい(大きい)エレメントを取ってくる。これはmatlabより優れている。

>>> import numpy as np

>>> a = np.random.rand(2,3)

>>> a

array([ [0.812, 0.834, 0.406],

           [0.133, 0.775, 0.654]])

>>> np.min(a)

0.133

>>> np.min(a, axis=0) # 行方向に走査して、各列の最小値を返す

array([0.133, 0.775, 0.406])

>>> np.min(a, axis=1) #列方向に走査して、各行の最小値を返す

array([0.406, 0.133])

最小(大)値をとるインデックスを返す

argmin, argmax関数です。なんという直観的コマンド名!!

matlabだとmin, maxに入っているからなぁ。

>>> a

array([ [0.812, 0.834, 0.406],

           [0.133, 0.775, 0.654]])

>>> np.argmin(a) # 要素番号は[0,0] -> [0,1] ->[0,2]->[1,0]->と列方向から増える

3

>>> np.argmin(a, axis=0) # 行方向に走査して、各列の最小値インデックスを返す

array([1, 1, 0])

>>> np.argmin(a, axis=1) #列方向に走査して、各行の最小値インデックスを返す

array([2, 0])

 

ランダムな値の入ったarrayを返す

numpy.random.randで[0,1]一様、numpy.random.randnで標準正規分布です。

一つ注意なのは、zeros()とかと違ってサイズはlist(tuple)じゃなくて

matlabっぽく要素サイズをならべる点。

>>> b = np.random.rand(2)

>>> b

array([ 0.502, 0.925 ])

>>> c = np.random.rand(2,3)

>>> c

array([ [ 0.361, 0.568, 0.764 ],

            [ 0.876, 0.751, 0.695] ])

>>> d = np.random.randn(1, 1, 2) #matlabと同様、これはただの2行arrayじゃないことに注意

>>> d

array( [ [ [ 0.701, -0.324 ] ] ] )

 

要素を見つける

numpy.where()で出来る。

numpy.nonzero()は非零要素に特化しているのでwhereの特殊バージョン。

whereで条件なしはnonzeroに一致するらしい。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

 

>>> import numpy as np
>>> a = np.random.randn(2,3)
>>> print a
[[ 0.93617619 -1.03255708 -1.26921922]
 [ 0.5476366  -0.82339777 -1.30260101]]
>>> np.where(a > -1)
(array([0, 1, 1]), array([0, 0, 1]))