Uzyskaj pozycję największej wartości w wielowymiarowej tablicy NumPy

83

Jak uzyskać pozycję (indeksy) największej wartości w wielowymiarowej tablicy NumPy?

kame
źródło
W przypadku, gdy istnieje wiele pozycji o równie dużych wartościach, czy potrzebujesz ich wszystkich, czy tylko pierwszej (lub ostatniej lub dowolnej)?
Trilarion

Odpowiedzi:

179

argmax()Metoda powinna pomóc.

Aktualizacja

(Po przeczytaniu komentarza) Uważam, że argmax()metoda będzie działać również dla tablic wielowymiarowych. Dołączona dokumentacja zawiera przykład:

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

Zaktualizuj 2

(Dzięki komentarzowi Kenny'egoTM ) Możesz użyć, unravel_index(a.argmax(), a.shape)aby pobrać indeks jako krotkę:

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)
Manoj Govindan
źródło
1
Ale mam tablicę wielowymiarową.
kame
86
Służy unravel_index(a.argmax(), a.shape)do pobierania indeksu jako krotki.
kennytm
co oznacza liczba 3? Ok rozumiem. Szukałem (1,0).
kame
2
naprawdę powinna istnieć wbudowana funkcja do pobierania wartości jako krotki
endolith.
unravel_index docs: docs.scipy.org/doc/numpy-1.10.1/reference/generated/…
Bogdan Varlamov
6

(edytuj) Miałem na myśli starą odpowiedź, która została usunięta . Zaakceptowana odpowiedź przyszła po mojej. Zgadzam się, że argmaxto lepsze niż moja odpowiedź.

Czy nie byłoby bardziej czytelne / intuicyjne, aby to zrobić?

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

Lub,

numpy.argwhere(a.max() == a)
wydra
źródło
4
Niepotrzebnie wolno, ponieważ obliczasz maksimum, a następnie porównujesz je ze wszystkimi. unravel_index (a.argmax (), a.shape).
Peter
Głosowałem za tym, ponieważ nie zakłada nic o liczbie wystąpień a.max () w a. Natomiast a.argmax () zwróci „pierwsze” wystąpienie (które jest źle zdefiniowane w przypadku tablicy wielowymiarowej, ponieważ zależy od wyboru ścieżki przejścia). docs.scipy.org/doc/numpy/reference/generated/… Myślę też, że np.where () jest bardziej naturalnym / czytelnym wyborem niż np.nonzero ().
FizxMike
2

Możesz po prostu napisać funkcję (która działa tylko w 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)
iFederx
źródło
0

Alternatywnym sposobem jest zmiana numpytablicy na listoraz użycie maxi indexmetody:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4

źródło