1つの軸に沿ってnumpy配列の最大要素のインデックスを取得する方法


118

2次元のNumPy配列があります。軸の最大値を取得する方法を知っています。

>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])

最大要素のインデックスを取得するにはどうすればよいですか?だから私は出力として欲しいarray([1,1,0])

回答:


141
>>> a.argmax(axis=0)

array([1, 1, 0])

1
これは整数では問題なく機能しますが、float値と0と1の間の数値に対して何ができますか
Priyom saha

100
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4

11
この回答は誤解を招くものであることに注意してください。これは、OPが要求するように特定の軸に沿ってではなく、すべての軸にわたって配列の最大要素のインデックスを計算します。それは間違っています。さらに、最大値が複数ある場合は、最初の最大値のみのインデックスを取得します。これを指摘する必要があります。a = np.array([[1,4,3],[4,3,1]])で戻りi,j==0,1、での解が無視されることを確認してくださいi,j==1,0。すべての最大値のインデックスについては、代わりに使用してくださいi,j = where(a==a.max()
gg349

36

argmax()各行の最初の出現のみを返します。 http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

成形された配列に対してこれを行う必要がある場合、これは次の方法よりうまく機能しますunravel

import numpy as np
a = np.array([[1,2,3], [4,3,1]])  # Can be of any shape
indices = np.where(a == a.max())

条件を変更することもできます。

indices = np.where(a >= 1.5)

上記はあなたが要求した形で結果を与えます。または、次の方法でx、y座標のリストに変換できます。

x_y_coords =  zip(indices[0], indices[1])

2
これは私にとってはうまくいきませんでした... indices = np.where(a==a.max())3行目ですか?
atomh33ls 14

あなたは正しい、atom33ls!見つけてくれてありがとう。適切な条件の2番目の等号を含めるようにそのステートメントを修正しました。
SevakPrime 2014

@SevakPrime、の.max()代わりに@ atomh33lsによって指摘された2番目のエラーがありました.argmax()。回答を編集してください
gg349

@ gg349、それはあなたが望むものに依存します。argmaxは軸に沿ってそれを提供します。これは、OPがeumiroによってその回答を承認したことを望む方法のようです。
SevakPrime

OPが特定の軸に沿って最大の要素について尋ねている間に、@ atomh33lsの修正と提案が配列の最大の要素のインデックスにつながることを確認します。ただし、現在のソリューションでは、x_y_coord = [(0, 2), (1, 1)]@ eumiroの回答と一致せず、間違っていることに注意してください。たとえばa = array([[7,8,9],[10,11,12]])、コードでこの入力にヒットがないことを確認してみてください。また、これはよりもうまく機能すると述べていますunravelが、@ blasによって投稿されたソリューションは、1つの軸に沿ったjsutではなく、絶対最大値の問題に答えます。
gg349

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.