非フラットインデックスを返すnumpy配列のArgmax


99

Numpy配列の最大要素のインデックスを取得しようとしています。これは、を使用して実行できますnumpy.argmax。私の問題は、配列全体で最大の要素を見つけて、そのインデックスを取得したいということです。

numpy.argmax 私が望むものではない1つの軸に沿って適用することも、私が望むものの一種であるフラット化された配列に適用することもできます。

私の問題は、多次元インデックスが必要なときにnumpy.argmaxwithを使用するとaxis=Noneフラットインデックスが返されることです。

divmod平坦でないインデックスを取得するために使用できますが、これは醜い感じです。これを行うためのより良い方法はありますか?

回答:



21
np.where(a==a.max())

最大要素の座標を返しますが、配列を2回解析する必要があります。

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

これは、と比較しargmaxて、最大値に等しいすべての要素の座標を返します。argmaxそれらの1つだけを返します(np.ones(5).argmax()returns 0)。


10
これにより、配列が2回だけでなく、3回繰り返されます。1回目は最大値を見つけ、2回目はの結果を作成し==、3回目Trueはこの結果から値を抽出します。最大値に等しいアイテムが複数ある場合があることに注意してください。
Sven Marnach 2012

1

最大値のすべての出現の非フラットインデックスを取得するには、次の代わりにを使用してeumiroの答えをわずかに変更できます。argwherewhere

np.argwhere(a==a.max())

>>> a = np.array([[1,2,4],[4,3,4]])
>>> np.argwhere(a==a.max())
array([[0, 2],
       [1, 0],
       [1, 2]])

3つのパスとマトリックスの作成を取得するため、効果的ではありません。9000x7000の画像(A3 @ 600dpi)があると想像してみてください。それでも、ソリューションを主張しますか?
Maksym Ganenko 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.