비평 탄 인덱스를 반환하는 numpy 배열의 Argmax


99

Numpy 배열에서 최대 요소의 인덱스를 얻으려고합니다. 이 작업은 numpy.argmax. 내 문제는 전체 배열에서 가장 큰 요소를 찾고 그 인덱스를 얻고 싶다는 것입니다.

numpy.argmax 내가 원하는 것이 아닌 하나의 축을 따라 적용하거나 내가 원하는 일종의 평평한 배열에 적용 할 수 있습니다.

내 문제는 사용하는 것입니다 numpy.argmax함께axis=None 하면 다차원 인덱스를 원할 때 플랫 인덱스 반환 입니다.

divmod평평하지 않은 인덱스를 얻는 데 사용할 수 있지만 이것은 추악한 느낌입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변:


171

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

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

최대 요소의 좌표를 반환하지만 배열을 두 번 구문 분석해야합니다.

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

이는와 비교 argmax하여 최대 값과 동일한 모든 요소의 좌표를 반환합니다. argmax그중 하나만 반환합니다 ( np.ones(5).argmax()반환 0).


10
이것은 배열을 두 번이 아니라 세 번 반복합니다. 최대 값을 찾기 위해 한 번,의 결과를 빌드하는 데 두 번 ==, 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]])

세 번의 패스와 한 번의 행렬 생성을 얻으므로 효과적이지 않습니다. 9000x7000 이미지 (A3 @ 600dpi)가 있다고 상상해보십시오. 여전히 솔루션을 고집 하시겠습니까?
Maksym Ganenko 2018
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.