質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.63%

  • Python 3.x

    5866questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

多次元配列 最大値のインデックス取得

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,779

DANNBU

score 11

pythonで多次元配列の最大値のインデックスを取ってくるのってどうすればいいのでしょうか?

例えば、a = [[0,1,1],[2,2,5],[2,1,3]]という配列があった時に
最大値が5なのでa[1][2]を返すようにしたいのですが、どういう風にしたらいいかご教授ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/10/10 15:45

    「a[1][2]を返す」とは、どのような値が得られることを意味しているのでしょうか? [1,2](2つの数のリスト)ですか、a[1][2]'という文字列でしょうか、あるいはa[1][2]の値であり同時に立次元配列の最大値である5という数値でしょうか?

    キャンセル

  • DANNBU

    2017/10/11 01:04

    この 1と2の情報がほしいです。この1と2の情報をy ,x みたいな感じで二つの変数で返したいんですよね y = 1 x = 2みたいな。。。

    キャンセル

回答 3

checkベストアンサー

+2

基本的には私も、 LouiS0616さんが書いておられる numpy.argmax() を使用する方法がベストな方法と考えます。

ただ、numpy.argmax() はドキュメントに書かれている通り、最大値が複数のある場合は最初のインデックスのみが返ります。
ですので、最大値が複数ある場合で、全てのインデックスを導きたいというのであれば numpy.argwhere() を御使用ください。
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.argwhere.html

import numpy as np

a = [[0,1,1],[2,2,5],[2,5,3]]
arr = np.array(a)
max_indexes = np.argwhere(arr == arr.max())

print(max_indexes)
# => [[1 2]
#     [2 1]]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

numpyを使う方法ですが。

https://qiita.com/saa/items/6dc24d79abaca53c7e13

argmax=lambda A:np.unravel_index(np.array(A).argmax(), np.array(A).shape)

ちょっと書き換えて、次のように使えばよいかと。

import numpy as np

def argmax_ndim(arg_array):
    return np.unravel_index(arg_array.argmax(), arg_array.shape)

a = np.array([[0,1,1],[2,2,5],[2,1,3]])
print(argmax_ndim(a))

"""出力
(1, 2)
"""

ラムダ式がわかるならそのまま使った方が簡潔でしょう。


どうしてもnumpyを使いたくない場合。

def flatten_2dim(array):
    return [item for sublist in array for item in sublist]

def argmax_2dim(array):
    flat_array = flatten_2dim(array)

    row_num = len(array)
    max_index = flat_array.index(max(flat_array))

    return max_index // row_num, max_index % row_num

a = [[0,1,1],[2,2,5],[2,1,3]]
print(argmax_2dim(a))

皆さん『複数最大値がある場合』について言及されているので、便乗してみる。

def flatten_2dim(array):
    return [item for sublist in array for item in sublist]

def all_argmax_2dim(array):
    flat_array = flatten_2dim(array)

    row_num = len(array)
    max_value = max(flat_array)

    for i, elem in enumerate(flat_array):
        if elem == max_value:
            yield i // row_num, i % row_num

a = [[0,5,5],[2,2,5],[5,1,3]]
for argmax in all_argmax_2dim(a):
    print(argmax)

"""出力
(0, 1)
(0, 2)
(1, 2)
(2, 0)
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

2次元リストだと仮定すると、まず各リストの最大値とそのインデックスをそれぞれ求め(下のb)、次にその中からさらに最大値をとります。

a = [[0,1,1],[2,2,5],[8,1,6]]

b = [max(enumerate(l), key=lambda x: x[1]) for l in a]
# [(1, 1), (2, 5), (0, 8)]

maximum = max(enumerate(b), key=lambda x: x[1][1])
# (2, (0, 8))

(2, (0, 8))が返りましたが、これはa[2][0]=8が最大値ということです。

最大値のインデックスをすべて求めたい場合

a = [[0,8,1],[2,2,5],[8,1,6]]

maximum = max(max(l) for l in a)

maximum_indices = [(i, j) for i, l in enumerate(a)
                          for j, x in enumerate(l) if x == maximum]
# [(0, 1), (2, 0)]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5866questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。