np.argmax・np.argminとは?最大値・最小値の位置を取得する方法【NumPy】

NumPyでは、配列の中から最大値・最小値そのものではなく、その位置(インデックス)を取得したいことがあります。

そのようなときに使うのが、np.argmax()np.argmin()です。

  • np.argmax():最大値のインデックスを取得

  • np.argmin():最小値のインデックスを取得

この記事では、np.argmax()np.argmin()の基本的な使い方から、2次元配列でのaxisの指定方法まで、Python初心者向けに解説します。

np.argmaxとは?

np.argmax()は、NumPy配列の中から最大値を持つ要素のインデックスを返す関数です。

基本構文は次のとおりです。

np.argmax(array)

np.argmaxの基本例

import numpy as np

data = np.array([10, 30, 20, 50, 40])

result = np.argmax(data)

print(result)

実行結果:

3

配列は次のようになっています。

インデックス:  0   1   2   3   4
値:           10  30  20  50  40

最大値は50で、インデックスは3です。

したがって、

np.argmax(data)

の結果は3になります。

最大値そのものを取得するには?

np.argmax()が返すのは、最大値ではなく最大値の位置です。

最大値そのものを取得する場合は、np.max()を使います。

import numpy as np

data = np.array([10, 30, 20, 50, 40])

print(np.max(data))
print(np.argmax(data))

実行結果:

50
3

つまり、

np.max(data)

は最大値を取得し、

np.argmax(data)

は最大値のインデックスを取得します。

np.argminとは?

np.argmin()は、NumPy配列の中から最小値を持つ要素のインデックスを返します。

基本構文は次のとおりです。

np.argmin(array)

np.argminの基本例

import numpy as np

data = np.array([10, 30, 20, 50, 40])

result = np.argmin(data)

print(result)

実行結果:

0

最小値は10で、インデックスは0です。

最小値そのものを取得するには?

最小値そのものを取得する場合はnp.min()を使います。

import numpy as np

data = np.array([10, 30, 20, 50, 40])

print(np.min(data))
print(np.argmin(data))

実行結果:

10
0

np.min()np.argmin()の違いを整理すると、次のようになります。

関数 取得するもの
np.max() 最大値
np.argmax() 最大値のインデックス
np.min() 最小値
np.argmin() 最小値のインデックス

np.argmaxとnp.argminを比較する

np.argmax()np.argmin()は非常によく似ています。

import numpy as np

data = np.array([15, 8, 32, 4, 21])

print(np.argmax(data))
print(np.argmin(data))

実行結果:

2
3

最大値は32なのでインデックスは2

最小値は4なのでインデックスは3です。

最大値・最小値の位置から値を取得する

np.argmax()np.argmin()で取得したインデックスを使えば、元の配列から値を取得できます。

import numpy as np

data = np.array([15, 8, 32, 4, 21])

index = np.argmax(data)

print(data[index])

実行結果:

32

最小値の場合も同じです。

index = np.argmin(data)

print(data[index])

実行結果:

4

2次元配列でnp.argmaxを使う

np.argmax()は2次元配列にも使用できます。

import numpy as np

data = np.array([
    [10, 50, 20],
    [30, 40, 60]
])

print(np.argmax(data))

実行結果:

5

デフォルトでは配列を平坦化(1次元化)して考えた場合のインデックスが返されます。

平坦化すると、

[10, 50, 20, 30, 40, 60]

となるため、最大値60のインデックスは5です。

axisを指定してnp.argmaxを使う

2次元以上の配列では、axisを指定すると便利です。

import numpy as np

data = np.array([
    [10, 50, 20],
    [30, 40, 60]
])

print(np.argmax(data, axis=0))

実行結果:

[1 0 1]

axis=0では、列ごとに最大値の位置を調べます。

列ごとに見ると、

10  50  20
30  40  60

1列目では30が最大なのでインデックス1

2列目では50が最大なのでインデックス0

3列目では60が最大なのでインデックス1です。

axis=1の場合

axis=1を指定すると、行ごとに最大値の位置を取得できます。

import numpy as np

data = np.array([
    [10, 50, 20],
    [30, 40, 60]
])

print(np.argmax(data, axis=1))

実行結果:

[1 2]

1行目では50が最大なのでインデックス1

2行目では60が最大なのでインデックス2です。

np.argminでもaxisを指定できる

np.argmin()でも同じようにaxisを指定できます。

import numpy as np

data = np.array([
    [10, 50, 20],
    [30, 40, 60]
])

print(np.argmin(data, axis=1))

実行結果:

[0 0]

1行目の最小値は10なのでインデックス0

2行目の最小値は30なのでインデックス0です。

最大値・最小値が複数ある場合

最大値や最小値が複数存在する場合、np.argmax()np.argmin()最初に見つかったインデックスを返します。

例えば、

import numpy as np

data = np.array([10, 50, 20, 50, 30])

print(np.argmax(data))

実行結果:

1

最大値の50はインデックス13にあります。

しかし、np.argmax()が返すのは最初の1です。

同様に、

data = np.array([10, 5, 20, 5, 30])

print(np.argmin(data))

実行結果:

1

最小値5が複数ありますが、最初のインデックス1が返されます。

np.argmax・np.argminとmax・minの違い

初心者が混同しやすいのが、np.max()np.min()との違いです。

import numpy as np

data = np.array([10, 30, 20, 50, 40])

print(np.max(data))
print(np.argmax(data))

print(np.min(data))
print(np.argmin(data))

実行結果:

50
3
10
0

覚え方は簡単です。

maxminは「値」を返す。
argmaxargminは「位置」を返す。

「arg」はargumentの略として使われていますが、NumPyでは最大値・最小値のインデックスを知りたいときの関数として覚えておくとよいでしょう。

np.argmax・np.argminのまとめ

np.argmax()np.argmin()は、NumPy配列の中から最大値・最小値の位置を調べるための関数です。

np.argmax(array)

は最大値のインデックスを返します。

np.argmin(array)

は最小値のインデックスを返します。

最大値・最小値そのものを取得したい場合は、

np.max(array)
np.min(array)

を使います。

2次元配列では、

np.argmax(array, axis=0)
np.argmax(array, axis=1)

np.argmin(array, axis=0)
np.argmin(array, axis=1)

のようにaxisを指定することで、列ごと・行ごとの最大値・最小値の位置を取得できます。

np.argmax・np.argminの使い分け

やりたいこと 関数
最大値を取得 np.max()
最大値の位置を取得 np.argmax()
最小値を取得 np.min()
最小値の位置を取得 np.argmin()

特に、**「一番大きいデータが配列の何番目にあるか」「一番小さいデータが何番目にあるか」**を調べたい場合には、np.argmax()np.argmin()が便利です。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら