Sponsored Link

(32) maxとargmax

(32) maxとargmax

仕様

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

列方向(↓)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
a[ * ][ 0 ] では、a[ 2 ][ 0 ] の 8
a[ * ][ 1 ] では、a[ 1 ][ 1 ], a[ 3 ][ 1 ] の 5
a[ * ][ 2 ] では、a[ 3 ][ 2 ] の 6

>>> a.max(0)
array([ 8.,  5.,  6.])
>>> a.argmax(0)
array([2, 1, 3])

OK だ。
ただし、同じ値の要素が複数個存在する場合は、インデックス値の小さな方のみ教えてくれる。

次に行方向(→)の最大値および、最大値を持つ要素のインデックスを取得してみる。
目視で調べると期待する結果は以下の通りだが…
a[ 0 ][ * ] では、a[ 0 ][ 0 ], a[ 0 ][ 1 ] の 3
a[ 1 ][ * ] では、a[ 1 ][ 1 ] の 5
a[ 2 ][ * ] では、a[ 2 ][ 0 ] の 8
a[ 3 ][ * ] では、a[ 3 ][ 2 ] の 6

>>> a.max(1)
array([ 3.,  5.,  8.,  6.])
>>> a.argmax(1)
array([0, 1, 0, 2])

OK だ。

【注意】
argmax では、配列中に同じ値の要素が複数個存在した場合、インデックス値の小さい方を出力する仕様みたい。

また、max, argmax の引数で軸番号を指定しない場合、全要素を対象に最大値を探してくれる。

>>> a.max()
8.0
>>>
>>> a.argmax()
6

この場合、a.argmax()は、配列を1次元に直列に展開したときのインデックス値を返す仕様のようだ。


2件のフィードバック »

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

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

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

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

コメントを残す

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

*