파이썬에서 NumPy argmax() 함수를 사용하는 방법

게시 됨: 2022-09-14

이 튜토리얼에서는 NumPy argmax() 함수 를 사용하여 배열에서 최대 요소의 인덱스를 찾는 방법을 배웁니다.

NumPy는 Python의 과학 컴퓨팅을 위한 강력한 라이브러리입니다. Python 목록보다 성능이 뛰어난 N차원 배열을 제공합니다. NumPy 배열로 작업할 때 수행할 일반적인 작업 중 하나는 배열에서 최대값을 찾는 것입니다. 그러나 때때로 최대값이 발생하는 인덱스 를 찾고 싶을 수 있습니다.

argmax() 함수는 1차원 및 다차원 배열 모두에서 최대값의 인덱스를 찾는 데 도움이 됩니다. 어떻게 작동하는지 계속 알아보자.

NumPy 배열에서 최대 요소의 인덱스를 찾는 방법

이 튜토리얼을 따라 하려면 Python과 NumPy가 설치되어 있어야 합니다. Python REPL을 시작하거나 Jupyter 노트북을 시작하여 코드를 작성할 수 있습니다.

먼저 일반적인 별칭 np 로 NumPy를 가져오겠습니다.

 import numpy as np

NumPy max() 함수를 사용하여 배열의 최대값을 얻을 수 있습니다(선택적으로 특정 축을 따라).

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.max(array_1)) # Output 10

이 경우 np.max(array_1) 는 10을 반환하며 이는 정확합니다.

배열에서 최대값이 발생하는 인덱스를 찾고 싶다고 가정합니다. 다음 2단계 접근 방식을 취할 수 있습니다.

  1. 최대 요소를 찾으십시오.
  2. 최대 요소의 인덱스를 찾습니다.

array_1 에서 최대값 10은 인덱스 4에서 0인 인덱싱에 이어 발생합니다. 첫 번째 요소는 인덱스 0에 있습니다. 두 번째 요소는 인덱스 1에 있는 식입니다.

numpy-argmax

최대값이 발생하는 인덱스를 찾으려면 NumPy where() 함수를 사용할 수 있습니다. np.where(condition)conditionTrue 인 모든 인덱스의 배열을 반환합니다.

배열을 탭하고 첫 번째 인덱스의 항목에 액세스해야 합니다. 최대값이 발생하는 위치를 찾기 위해 conditionarray_1==10 으로 설정합니다. 10이 array_1 의 최대값이라는 것을 기억하십시오.

 print(int(np.where(array_1==10)[0])) # Output 4

조건 있는 np.where() 를 사용했지만 이 함수를 사용하는 데 권장되는 방법은 아닙니다 .

참고: NumPy where() 함수 :
np.where(condition,x,y) 는 다음을 반환합니다.

– 조건이 True 일 때 x 의 요소, 그리고
– 조건이 False 일 때 y 의 요소.

따라서 np.max()np.where() 함수를 연결하면 최대 요소를 찾고 해당 요소가 발생하는 인덱스를 찾을 수 있습니다.

위의 2단계 프로세스 대신 NumPy argmax() 함수를 사용하여 배열의 최대 요소 인덱스를 가져올 수 있습니다.

NumPy argmax() 함수의 구문

NumPy argmax() 함수를 사용하는 일반적인 구문은 다음과 같습니다.

 np.argmax(array,axis,out) # we've imported numpy under the alias np

위 구문에서:

  • 배열 은 유효한 NumPy 배열입니다.
  • 축은 선택적 매개변수입니다. 다차원 배열로 작업할 때 axis 매개변수를 사용하여 특정 축을 따라 최대값의 인덱스를 찾을 수 있습니다.
  • out 은 또 다른 선택적 매개변수입니다. out 매개변수를 NumPy 배열로 설정하여 argmax() 함수의 출력을 저장할 수 있습니다.

참고 : NumPy 버전 1.22.0부터 추가 keepdims 매개변수가 있습니다. argmax() 함수 호출에서 axis 매개변수를 지정하면 해당 축을 따라 배열이 축소됩니다. 그러나 keepdims 매개변수를 True 로 설정하면 반환된 출력이 입력 배열과 같은 모양이 됩니다.

NumPy argmax()를 사용하여 최대 요소의 인덱스 찾기

#1 . NumPy argmax() 함수를 사용하여 array_1 에서 최대 요소의 인덱스를 찾습니다.

 array_1 = np.array([1,5,7,2,10,9,8,4]) print(np.argmax(array_1)) # Output 4

argmax() 함수는 4를 반환합니다. 이는 정확합니다!

#2 . 10이 두 번 발생하도록 array_1 을 재정의하면 argmax() 함수는 첫 번째 발생의 인덱스 반환합니다.

 array_1 = np.array([1,5,7,2,10,10,8,4]) print(np.argmax(array_1)) # Output 4

나머지 예제에서는 예제 #1에서 정의한 array_1 의 요소를 사용합니다.

NumPy argmax()를 사용하여 2D 배열에서 최대 요소의 인덱스 찾기

NumPy 배열 array_1 을 2개의 행과 4개의 열이 있는 2차원 배열로 변형해 보겠습니다.

 array_2 = array_1.reshape(2,4) print(array_2) # Output [[ 1 5 7 2] [10 9 8 4]]

2차원 배열의 경우 축 0은 행을 나타내고 축 1은 열을 나타냅니다. NumPy 배열은 제로 인덱싱을 따릅니다. 따라서 NumPy 배열 array_2 의 행과 열 인덱스는 다음과 같습니다.

numpy-argmax-2darray

이제 2차원 배열 array_2 에서 argmax() 함수를 호출해 보겠습니다.

 print(np.argmax(array_2)) # Output 4

2차원 배열에서 argmax() 를 호출했지만 여전히 4를 반환합니다. 이는 이전 섹션의 1차원 배열 array_1 의 출력과 동일합니다.

왜 이런 일이 발생합니까?

이는 axis 매개변수에 대한 값을 지정하지 않았기 때문입니다. 이 축 매개변수가 설정되지 않은 경우 기본적으로 argmax() 함수는 평면화된 배열을 따라 최대 요소의 인덱스를 반환합니다.

평면 배열이란 무엇입니까? d1 x d2 x … x dN 모양의 N차원 배열이 있는 경우, 여기서 d1, d2, 최대 dN은 N차원에 따른 배열의 크기이며, 평면화된 배열 은 크기의 긴 1차원 배열입니다. d1 * d2 * ... * dN.

array_2 에 대해 병합된 배열이 어떻게 보이는지 확인하려면 아래와 같이 flatten() 메서드를 호출할 수 있습니다.

 array_2.flatten() # Output array([ 1, 5, 7, 2, 10, 9, 8, 4])

행을 따라 최대 요소 인덱스(축 = 0)

행(축 = 0)을 따라 최대 요소의 인덱스를 찾기 위해 계속 진행해 보겠습니다.

 np.argmax(array_2,axis=0) # Output array([1, 1, 1, 1])

이 출력은 이해하기 다소 어려울 수 있지만 작동 방식은 이해할 것입니다.

행을 따라 최대 요소의 인덱스를 찾고 싶기 때문에 axis 매개변수를 0( axis = 0 )으로 설정했습니다. 따라서 argmax() 함수는 세 열 각각에 대해 최대 요소가 발생하는 행 번호를 반환합니다.

더 나은 이해를 위해 이것을 시각화해 보겠습니다.

numpy-argmax-axis0

위의 다이어그램과 argmax() 출력에서 ​​다음을 확인할 수 있습니다.

  • 인덱스 0에 있는 첫 번째 열의 경우 인덱스 = 1인 두 번째 행에서 최대값 10 이 발생합니다.
  • 인덱스 1에 있는 두 번째 열의 경우 인덱스 = 1인 두 번째 행에서 최대값 9 가 발생합니다.
  • 인덱스 2와 3에 있는 세 번째와 네 번째 열의 경우 최대값 84 는 모두 인덱스 = 1인 두 번째 행에서 발생합니다.

이것이 바로 우리가 출력 array([1, 1, 1, 1]) 을 갖는 이유입니다. 행을 따라 최대 요소가 두 번째 행(모든 열에 대해)에서 발생하기 때문입니다.

열을 따라 최대 요소 인덱스(축 = 1)

다음으로 argmax() 함수를 사용하여 열을 따라 최대 요소의 인덱스를 찾습니다.

다음 코드 조각을 실행하고 출력을 관찰합니다.

 np.argmax(array_2,axis=1)
 array([2, 0])

출력을 구문 분석할 수 있습니까?

열을 따라 최대 요소의 인덱스를 계산하기 위해 axis = 1 을 설정했습니다.

argmax() 함수는 각 행에 대해 최대값이 발생하는 열 번호를 반환합니다.

다음은 시각적 설명입니다.

numpy-argmax-axis1

위의 다이어그램과 argmax() 출력에서 ​​다음을 확인할 수 있습니다.

  • 인덱스 0의 첫 번째 행에서 최대값 7 은 인덱스 = 2인 세 번째 열에서 발생합니다.
  • 인덱스 1에 있는 두 번째 행의 경우 인덱스 = 0인 첫 번째 열에서 최대값 10 이 발생합니다.

이제 출력 array([2, 0]) 이 의미하는 바를 이해하셨기를 바랍니다.

NumPy argmax()에서 선택적 out 매개변수 사용

NumPy argmax() 함수의 선택적 out 매개변수를 사용하여 NumPy 배열에 출력을 저장할 수 있습니다.

이전 argmax() 함수 호출의 출력을 저장하기 위해 0의 배열을 초기화해 보겠습니다. 열을 따라 최대값의 인덱스를 찾습니다( axis= 1 ).

 out_arr = np.zeros((2,)) print(out_arr) [0. 0.]

이제 열을 따라 최대 요소의 인덱스를 찾는 예( axis = 1 )를 다시 살펴보고 위에서 정의한 outout_arr 로 설정해 보겠습니다.

 np.argmax(array_2,axis=1,out=out_arr)

out_arr 이 기본적으로 float 배열로 초기화되었기 때문에 Python 인터프리터가 TypeError 를 던지는 것을 볼 수 있습니다.

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds) 56 try: ---> 57 return bound(*args, **kwds) 58 except TypeError: TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

따라서 out 매개변수를 출력 배열로 설정할 때 출력 배열의 모양과 데이터 유형이 올바른지 확인하는 것이 중요합니다. 배열 인덱스는 항상 정수이므로 출력 배열을 정의할 때 dtype 매개변수를 int 로 설정해야 합니다.

 out_arr = np.zeros((2,),dtype=int) print(out_arr) # Output [0 0]

이제 axisout 매개변수를 모두 사용하여 argmax() 함수를 호출할 수 있으며 이번에는 오류 없이 실행됩니다.

 np.argmax(array_2,axis=1,out=out_arr)

argmax() 함수의 출력은 이제 배열 out_arr 에서 액세스할 수 있습니다.

 print(out_arr) # Output [2 0]

결론

이 튜토리얼이 NumPy argmax() 함수를 사용하는 방법을 이해하는 데 도움이 되었기를 바랍니다. Jupyter 노트북에서 코드 예제를 실행할 수 있습니다.

배운 내용을 복습해 봅시다.

  • NumPy argmax() 함수는 배열의 최대 요소 인덱스를 반환합니다. 배열 a 에서 최대 요소가 두 번 이상 발생하면 np.argmax(a) 는 요소가 처음 나타나는 인덱스를 반환합니다.
  • 다차원 배열로 작업할 때 선택적 axis 매개변수를 사용하여 특정 축을 따라 최대 요소의 인덱스를 가져올 수 있습니다. 예를 들어 2차원 배열에서 axis = 0axis = 1 로 설정하면 행과 열을 따라 각각 최대 요소의 인덱스를 얻을 수 있습니다.
  • 반환된 값을 다른 배열에 저장하려면 선택적 out 매개변수를 출력 배열로 설정할 수 있습니다. 그러나 출력 배열은 모양과 데이터 유형이 호환되어야 합니다.

다음으로 Python 세트에 대한 심층 가이드를 확인하세요.