19,426 views
この記事は最終更新から 1806日 が経過しています。
仕様
max ( n ) は、配列の n 次元目の最大値を取得できる。
argmax ( n ) は、配列の n 次元目の最大値を持つ要素のインデックスを取得できる。
使用例
配列 a を乱数で作成する。
>>> import numpy as np >>> a = np.floor(np.random.rand(4,3)*10) >>> a array([[ 3., 3., 0.], [ 0., 5., 4.], [ 8., 0., 1.], [ 1., 5., 6.]])
[0] 列方向
列方向(↓)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
0列目 a[ * ][ 0 ] では、a[ 2 ][ 0 ] の 8
1列目 a[ * ][ 1 ] では、a[ 1 ][ 1 ], a[ 3 ][ 1 ] の 5
2列目 a[ * ][ 2 ] では、a[ 3 ][ 2 ] の 6
>>> a.max(0) array([ 8., 5., 6.]) >>> a.argmax(0) array([2, 1, 3])
OK だ。
ただし、同じ値の要素が複数個存在する場合は、インデックス値の小さな方のみ教えてくれる。
[1] 行方向
次に行方向(→)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
0行目 a[ 0 ][ * ] では、a[ 0 ][ 0 ], a[ 0 ][ 1 ] の 3
1行目 a[ 1 ][ * ] では、a[ 1 ][ 1 ] の 5
2行目 a[ 2 ][ * ] では、a[ 2 ][ 0 ] の 8
3行目 a[ 3 ][ * ] では、a[ 3 ][ 2 ] の 6
>>> a.max(1) array([ 3., 5., 8., 6.]) >>> a.argmax(1) array([0, 1, 0, 2])
OK だ。
こちらも同じ値の要素が複数個存在する場合は、インデックス値の小さな方のみ教えてくれる。
その他
当然だが 3次元以上でも同じことができる。
また、max, argmax の引数で軸番号を指定しない場合、全要素を対象に最大値を探してくれる。
この場合、a.argmax()は、配列を 1次元に直列に展開したときのインデックス値を返す仕様だ。
>>> a.max() 8.0 >>> >>> a.argmax() 6
確かに最大値 8は aを直列展開後に index=6の位置にある。
>>> a array([[ 3., 3., 0.], [ 0., 5., 4.], [ 8., 0., 1.], [ 1., 5., 6.]]) >>> a.reshape(-1) array([ 3., 3., 0., 0., 5., 4., 8., 0., 1., 1., 5., 6.])
行方向と列方向が逆になってます
a.max(0), a.argmax(0) の場合は列方向のインデックス
a.max(1), a.argmax(1) の場合は行方向のインデックスの取得です
def max(self, axis=None, out=None)
def argmax(a, axis=None)
であることからもわかります
ご指摘ありがとうございます。
真面目に勘違いしていました…