はじめに
Numpyの2次元配列を扱う際、何行何列目が最大(もしくは最小)かという情報が欲しい場合があります。これをnumpyで得るための2つの方法をまとめたいと思います。
- (簡単な方法)
numpy.unravel_index
を使う方法 - (少し複雑な方法)
numpy.argmax
(もしくはnumpy.argmin
)だけ使う方法
注意として本記事では、何行何列目を考える際 0始まりで考えることにします。例えば、上の行列の最大値 99 の位置は3行2列目ではなく、2行1列目です。
1. numpy.unravel_index を使う方法
第一引数に numpy.argmax
(もしくは numpy.argmin
)、第二引数に 配列の形状を入力します。
以下は行列の最大値の位置を求めた例です。
arr = np.array([[1,2,3,4,5], [6,7,8,9,10], [1,99,0,5,3]])
print(np.unravel_index(np.argmax(arr), arr.shape))
# (2,1)
numpyにすでに用意されている関数を使うだけなので簡単です。
2. numpy.argmax (もしくは numpy.argmin) だけ使う方法
numpy.argmax
で得られた数値と、配列の列数 を使って計算します。
結論から言うと、argmax
を 列数で割った商が何行目に最大値があるかに相当します。
そして、argmax
を列数で割った余りが何列目に最大値があるかに相当します。
#最大値の位置を計算
arr = np.array([[1,2,3,4,5], [6,7,8,9,10], [1,99,0,5,3]])
argmax = np.argmax(arr)
row, col = np.shape(arr) #行数, 列数
print(f"{argmax//col}行{argmax%col}列の値が最大値です")
#2行1列の値が最大値です
計算の仕組み
numpy.argmax (もしくはnumpy.argmin) は引数に与えられた配列を一次元に変換し、先頭から何番目が最大か(もしくは最小か)を計算しています。
したがって、何行目に最大値があるかは、先頭に行の1行1行のかたまり(赤の長方形)が何個あるか計算すれば良いということになります。
上の例では、最大値の99の前には赤のかたまりが2つあるので、2行目(0始まりで数えてます)にあると解釈できます。
したがって、何行目かを知るには、 argmax を列数で割った商を知れば良いことになります。
次は何列目かを考えます。
まず、最大値がある赤のかたまり(2行目)のインデックスに注目します。この行において、先頭から何番目に位置しているかわかれば良いです。
このとき、index (10~14) とindexを列数5で割った余り (0~4) とが対応していることがわかります。そして、列数5で割った余りと先頭から何番目かも対応しています。
そのため、argmaxを列数で割ると何列目なのか知ることができるのです。
まとめ・参考
二次元のnumpy.array から最大値・最小値を計算する方法についてまとめました。
単純に numpy.unravel_index を使うのもいいですが、たまには解き方を自分で考えてみるのもおもしろのではないかと思います。
コメント