多次元NumPy配列の最大値の位置を取得します


83

多次元NumPy配列の最大値の位置(インデックス)を取得するにはどうすればよいですか?


同じように大きな値を持つ複数の位置がある場合、それらすべてが必要ですか、それとも最初(または最後またはいずれか)だけが必要ですか?
トリラリオン

回答:


179

このargmax()方法が役立つはずです。

更新

(コメントを読んだ後)このargmax()方法は多次元配列でも機能すると思います。リンクされたドキュメントは、この例を示しています。

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

アップデート2

KennyTMのコメントに感謝します)unravel_index(a.argmax(), a.shape)インデックスをタプルとして取得するために使用できます。

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

1
しかし、私は多次元配列を持っています。
カメ2010

86
unravel_index(a.argmax(), a.shape)インデックスをタプルとして取得するために使用します。
kennytm 2010

3番はどういう意味ですか?なるほど。(1,0)を探していました。
カメ2010

2
タプルとして値を取得するための組み込み関数が実際にあるはずです
endolith 2013


6

(編集)削除された古い回答を参照していました。そして、受け入れられた答えは私の後に来ました。私はそれargmaxが私の答えよりも優れていることに同意します。

このようにする方が読みやすく、直感的ではないでしょうか。

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

または、

numpy.argwhere(a.max() == a)

4
最大値を計算し、それをすべてのaと比較するため、不必要に遅くなります。unravel_index(a.argmax()、a.shape)。
ピーター

これに投票したのは、aでのa.max()の出現回数については何も想定していないためです。一方、a.argmax()は「最初の」オカレンスを返します(これは、トラバーサルパスの選択に依存するため、多次元配列の場合は明確に定義されていません)。docs.scipy.org/doc/numpy/reference/generated/… また、np.nonzero()よりもnp.where()の方が自然で読みやすい選択だと思います。
fizxMike 2017

2

あなたは単に関数を書くことができます(2Dでのみ機能します):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)

0

別の方法は、numpy配列をに変更し、メソッドlistを使用することです。maxindex

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.