(32) maxとargmax

投稿者: | 2014年7月10日

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.])

(32) maxとargmax」への2件のフィードバック

  1. test

    行方向と列方向が逆になってます

    a.max(0), a.argmax(0) の場合は列方向のインデックス
    a.max(1), a.argmax(1) の場合は行方向のインデックスの取得です

    def max(self, axis=None, out=None)
    def argmax(a, axis=None)

    であることからもわかります

    返信
    1. user 投稿作成者

      ご指摘ありがとうございます。
      真面目に勘違いしていました…

      返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です