이번 포스팅에서는 Python numpy 의 메소드, 함수 중에서 


- 최소값, 최대값, 혹은 조건에 해당하는 색인(index) 값을 찾기 

   : np.argmin(), np.argmax(), np.where()


- 최소값, 최대값, 혹은 조건에 맞는 값 찾기 

   : np.min(), np.max(), x[np.where()]


에 대해서 소개하겠습니다. 


분석할 때 꽤 많이 사용되므로 기억해두시면 좋겠습니다. 





  (1) 최소값(min), 최대값(max): np.min(), np.max()


x.min(), np.min(x), min(x) 모두 동일한 결과를 반환합니다. 



In [1]: import numpy as np


In [2]: x = np.array([5, 4, 3, 2, 1, 0])


In [3]: x.min()

Out[3]: 0


In [4]: np.min(x)

Out[4]: 0


In [5]: x.max()

Out[5]: 5


In [6]: np.max(x)

Out[6]: 5

 




  (2) 최소값, 최대값의 색인 위치: np.argmin(), np.argmax()



In [7]: x.argmin()

Out[7]: 5


In [8]: np.argmin(x)

Out[8]: 5


In [9]: x.argmax()

Out[9]: 0


In [10]: np.argmax(x)

Out[10]: 0

 




  (3) 조건에 맞는 값의 색인 위치: np.where()


배열에서 3과 같거나 큰 값을 가지는 색인의 위치를 알고 싶을 때, 


 

In [11]: np.where(x >= 3)

Out[11]: (array([0, 1, 2], dtype=int64),)




(4) 조건에 맞는 값을 indexing 하기: x[np.where()] 


배열에서 3과 같거나 큰 값을 indexing 하고 싶을 때, 



In [12]: x[np.where(x >= 3)]

Out[12]: array([5, 4, 3])

 




  (5) 조건에 맞는 값을 특정 다른 값으로 변환하기

     : np.where(조건, 조건에 맞을 때 값, 조건과 다를 때 값)


배열의 값이 3과 같거나 크면 3으로 변환하고, 3보다 작으면 그대로 값을 유지하고 싶을 때, 

(for loop & if else 조건문을 사용하는 것보다 수십배 빠르므로 매우 유용함)



In [13]: np.where(x >= 3, 3, x)

Out[13]: array([3, 3, 3, 2, 1, 0])

 


 

참고로, 위의 np.where를 사용한 배열 값 변환을 for loop & if else 조건문을 사용해서 써보면 아래와 같습니다. for loop은 데이터 사이즈가 커질 경우 속도가 매우 느려지므로, 위의 대용량 데이터는 벡터화된 연산을 하는 np.where() 함수 사용을 권합니다. .

 

 

In [14]: x_2 = []

    ...: for i in list(x):

    ...: if i >= 3:

    ...: x_2.append(3)

    ...: else:

    ...: x_2.append(i)

    ...:

    ...:


In [15]: x_2 = np.asarray(x_2)


In [16]: type(x_2)

Out[16]: numpy.ndarray


In [17]: x_2

Out[17]: array([3, 3, 3, 2, 1, 0])

 

 

많은 도움이 되었기를 바랍니다. 

 

728x90
반응형
Posted by R Friend Rfriend

댓글을 달아 주세요

  1. seo 2020.07.23 23:00  댓글주소  수정/삭제  댓글쓰기

    argmax 설명 틀린 것 같네요

  2. 2020.10.16 04:27  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend Rfriend 2020.10.16 15:46 신고  댓글주소  수정/삭제

      안녕하세요.

      아래의 코드를 한번에 한줄씩 실행시켜보면서 그 결과를 눈으로 확인해보면 이해하기에 한결 쉬울 것 같습니다.

      import numpy as np

      x = np.array([2, 5, 1, 2, 3, 1, 2])

      # (1) 유일한 값 배열 반환
      np.unique(x)

      # (2) return_counts=True 이면 유일한 값 배열과 개수의 2개 array 반환
      np.unique(x, return_counts=True)

      # (3) 뒤에 [1] 은 위 (2)번의 2개 array 중 뒤에 있는 return_counts 즉, 개수 배열 반환
      np.unique(x, return_counts=True)[1]

      # (4) 위의 (3)번 결과에서 가장 큰 값이 있는 위치 index 값 반환
      np.argmax(np.unique(x, return_counts=True)[1])

      # (5) 위의 (4)번 결과값에 해당하는 위치의 값을 np.unique(x) 로 부터 indexing 해와서 반환
      np.unique(x)[np.argmax(np.unique(x, return_counts=True)[1])]

  3. method 2020.10.19 04:16  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 좋은글 잘 읽었습니다. 근데 혹시 argmax(x)에서 x에 같은 값(0,0,0,0)만 있을 때는 argmax()가 x 배열의 첫번째요소를 출력하게 되나요? 아니면 랜덤으로 출력하게 되나요?