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に入っているからなぁ。
>>> aarray([ [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]))