코딩일기

[numpy] np.newaxis는 무엇이고 언제 사용하는가? 본문

Code/딥러닝(NL)

[numpy] np.newaxis는 무엇이고 언제 사용하는가?

daje 2021. 10. 4. 09:25
728x90
반응형

 

출처 : 위키백과

 

안녕하십니까 다제입니다. 

 

오늘은 딥러닝 코드를 보다보면 자주 등장하는 np.newaxis라는 함수에 대해서 알아보도록 하겠습니다. 

 

하도 자주나와서 하나 포스팅하기로 하였습니다. 

 

 

1. np.newaixs란 ?

 -. np 행렬의 차원을 확장하는 함수 

 

 

출처 : azanewta.tistory.com

 

 

 

2. 사용방법

 1) 기본 사용법 

# 1차원 array를 만듭니다. 
In [7]: arr = np.arange(1, 5)
In [8]: arr.shape
Out[8]: (4,)
# 결과 
# array[1 2 3 4]

# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# 결과 : 각각의 숫자에 []가 쓰워지는 것을 볼 수 있습니다. 
# array[[1 2 3 4]]


# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis]
In [12]: col_vec.shape
Out[12]: (4, 1)
# 결과 : 차원이 하나 추가된 것을 보실 수 있습니다. 
# array([[1],
#        [2],
#        [3],
#        [4]])

 

2) Broadcasting 

 -. numpy broadcasting이라고 shape이 다른 array간 연산을 할때도  유용합니다.

 

 

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

print(x1*x2)

 

위와 같이 실행을 하게 되면 아래와 같은 오류를 만나게 됩니다. shape가 맞지 않아 연산을 할 수 없다는 이야기입니다. 

ValueError: operands could not be broadcast together with shapes (5,) (3,)

 

하지만 newaxis를 활용하면 연산이 가능합니다. 

x1_new = x1[:, np.newaxis]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])


In [2]: x1_new + x2
Out[1]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])
       
In [2]: x1_new * x2    
Out[2]:       
array([[ 5  4  3],
 	   [10  8  6],
       [15 12  9],
       [20 16 12],
       [25 20 15]])

 

 

3) 다중행 추가 

In [124]: arr = np.arange(5*5).reshape(5,5)

In [125]: arr.shape
Out[125]: (5, 5)

# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]

In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)

 

 

그런데 여기서 python이나 matlab등에 경험이 있으신 분들은 reshape라는 기능을 쓰면 되지 않느냐라고 반문 하실수 있겠네요. 하지만 reshape는 변환전 차원의 합과 변환후 차원의 합이 같아야 합니다. (4,1)을 변환한다는 기준으로 (2,2)는 reshape 가능한데 (4,1)을 (3,3)으로 부꿀수는 없다는 게 제약이 있는 거죠.

 

 

이 외에도 newaxis에 대한 내용들은 공식문서를 참고하여 주시면 감사드리겠습니다. 

 

Transformer를 구현할 때 딱 이정도만 알면 충분합니다. 

 

다시 Transformer를 공부하러 가보겠습니다. 

 

오늘도 글을 읽어주셔서 감사합니다. 

728x90
반응형
Comments