Numpy 유용한 함수

 

np.unique

  • 어떤 값들이 데이터에 들어있는지 알 수 있음. 추가적으로 각 데이터의 갯수 또한 return_counts 인자로 알 수 있음
unique, counts = np.unique(y, return_counts = True)
print(unique, counts)

np.where

다음의 2가지로 활용 가능하다.

  1. Condition 만족하는 Index 반환

    • 1차원일 경우
        import numpy as np
        a = np.arange(5, 15) # array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
        np.where(a > 10) # 6 ~ 9번 위치가 만족 -> (array([6, 7, 8, 9]),)
        np.where(a % 3 == 0) # 1, 4, 7번 위치가 6, 9, 12로 만족 -> (array([1, 4, 7]),)
      
    • 2차원 이상일 경우 (존재하는 axis에 대한 다양한 출력값 반환)
      a = np.array([[15, 8, 12], [11, 7, 3]])
      np.where(a > 10) # (array([0, 0, 1]), array([0, 2, 0]))
      
      # 앞의 array([0, 0, 1])은 axis=0을 기준으로 출력한 index
      # 뒤의 array([0, 2, 0])은 axis=1을 기준으로 출력한 index
      

  2. Condition의 True, False를 검사하여 원하는 값 출력

    즉 output의 class가 2개(binary)일 경우 np.where을 통해 numpy를 변환해주기 좋다

     a = np.array([[15, 8, 12], [11, 7, 3]])
     np.where(a > 10, a, 10) # a가 10보다 크면 그대로, 그렇지 않으면 10으로 설정
     # array([[15, 10, 12],
     #      [11, 10, 10]])
    
     b = np.array([[0, -1, 2], [-2, -1, -3]])
     np.where(a > 10, a * 2, b) # a가 10보다 크면 2배, 그렇지 않으면 그대로 b의 element 값
     # array([[30, -1, 24],
     #      [22, -1, -3]])
    

np.vectorization

리스트에 map 함수를 추가하여 element-wise 처리하는것처럼 numpy도 가능하다

import numpy as np

def temp_f(x):
    
    if x==1:
        return 100
    if x==2:
        return 200
    if x==3:
        return 300
    else:
        return 10000

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

v_func = np.vectorize(temp_f)

print(v_func(arr))

하지만 numpy는 array-wise하게 처리했을 때 속도가 빠르므로 별로 추천되지는 않는다.

np.transpose

상당히 자주 헷갈림.

아래의 예시를 통해 정확히 이해하자.

# torch.Tensor를 numpy 객체로 변환
    input = input.numpy().transpose((1, 2, 0))

아래 그림처럼 (1, 2, 0)으로 축들이 움직여야 하는 것임.
오해하지 말자. 어쩌다 보니 이상하게 생각하고 있었음.
현재의 축 인덱스가 1, 2, 0의 순서로 되게 하는것이 목표