LoginSignup
18
15

More than 5 years have passed since last update.

最大値を複数取り出す方法

Posted at

numpyで配列生成などはよくやりますね。
その配列の最大値のインデックスを知りたい、なんてこともよくありますよね。ないなんて言わせません

argmax関数

numpyには最大値のインデックスを求めてくれるargmax関数がありますが、これには少し問題があって最大値が複数あると最も小さいインデックスのみを返してくれます。
このことについては公式サイトのマニュアルにも末尾に記載されています。

test.py
import numpy as np
b = np.arange(6)    # [0, 1, 2, 3, 4, 5]
b[1] = 5            # [0, 5, 2, 3, 4, 5]
np.argmax(b)        # 1

for文&max関数

対策としてはfor文でやる方法もありますが、スマートじゃありませんし時間がかかりますよね。

findMax.py
a = np.array([0, 5, 2, 3, 5])
maxValue = np.max(a)
maxIndex = []
for i in range(len(a)):
    if maxVaule == a[i]:
        maxIndex.append(i)
print(maxIndex)    # [1, 4]

enumerate関数&内包表記

そこでenumerate関数内包表記を用いてカッコよく最大値を複数取り出します。
下記にそれぞれの参考サイトを記載します。

Python zipとenumerateの使い方
pythonの内包表記を少し詳しく

では早速書いてみましょう。

findMax2.py
a = np.array([0, 5, 2, 3, 5])
maxIndex = [i for i, x in enumerate(a) if x == max(a)]
print(maxIndex)    # [1, 4]

これだけです。とても簡潔でいいですよね。

これは余談ですが内包表記を使ってリストのstr型をリストのint型に1行で変換することもできちゃいます。paizaなどのプログラムスキルチェックしてくれるサイトの問題等で使えますね。

strToInt.py
strList = ["0", "1", "2", "3"]
intList = [int(i) for i in strList]
print(intList)    # [0, 1, 2, 3]
18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15