おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

リストの最大値(最小値)のindexを取得する

NumpyのArrayだと、argmaxを使って、最大値のindexを取得できる。
(ただし、最大値が重複して存在する場合は、一番小さいindexを返す仕様になっている)
numpy.argmax — NumPy v1.10 Manual


PythonのListにも同じような関数が用意されているかと思ったんだけど、ないみたいなので、書き方を調べてみた。
例えば、以下のようなListがあるとする。

list_name = [2, 3, 4, 8, 3, 1, 3, 5, 7, 8, 3, 2]

最大値は8で、最大値の位置するindexは3と9である(最大値には重複がある)。


Numpyのargmaxと同様に、重複がある場合に一番小さいindexを返したい場合には、以下のような書き方がある。

print list_name.index(max(list_name))
print max(enumerate(list_name), key=lambda x: x[1])[0]
print max(xrange(len(list_name)), key=lambda i: list_name[i])
import operator
print max(enumerate(list_name), key=operator.itemgetter(1))[0]
print max(zip(list_name, range(len(list_name))))[1]

一番小さいindexの3を返してくれる。
最後のやつだけ、大きいindexを返してくるが理由は良く分からん。


一部のindexだけでなく、全てのindexを返したい場合には、

print [i for i, x in enumerate(list_name) if x == max(list_name)]
[3, 9]

とリスト内包表記を使って、全ての最大値のindexを求めることが出来る。


いろいろ書き方がありましたが、速度などは比較してないです。
Ref:
リスト内の最大値を見つける - Screaming Loud
python - How to find all positions of the maximum value in a list? - Stack Overflow
python - Pythonic way to find maximum value and its index in a list? - Stack Overflow