web-dev-qa-db-ja.com

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

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

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

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

divmodを使用して非フラットインデックスを取得できますが、これは見苦しくなります。これを行うより良い方法はありますか?

72
Andreas Mueller

numpy.unravel_index()の結果に numpy.argmax() を使用できます。

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True
129
Sven Marnach
_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()は_0_を返します)。

16
eumiro

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

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]])
1
Richard Ludlow