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はインデックス1と3にあります。
しかし、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
覚え方は簡単です。
max・minは「値」を返す。
argmax・argminは「位置」を返す。
「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()が便利です。


