본문 바로가기

CS 잡지식

numpy.newaxis(feat. np.newaxis)

numpy라는 유명 라이브러리의 newaxis 요 표현은 무엇이냐?

 

간단히 이야기 해서 존재하는 numpy array의 차원을 늘려준다 보시면 되겠습니다.

 

* 1D 는 2D가 되고 2D는 3D가 되고 3D는 4D ..

 

 

 

 

 


 

사실 간단한 Role이지만 여러가지 상황에서 적재적소 사용되더군요..

 

3가지 정도의 시나리오에서 사용하기 적합해 보입니다.

 

 

첫번째,

 

1D array를 row vector나 column vector로 사용하고 싶을 경우지요.

 

아시다시피 numpy에서 array를 만들면 shape이 ..

 

# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)

 

요로케 되지오.. x자리만 4고 y자리는 공란입니다.

그러면 아주 간단하게 해결 됩니다.

# 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)

# 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)

 

두번째,

 

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

 

일단 한번 봐야되니까 아래와 같이 모양이 다른 array끼리 덧셈 한번 해봅시다.

x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
ValueError: operands could not be broadcast together with shapes (5,) (3,)

 

Vale Error.. 어찌보면 당연하시오. 수학적으로도 성립을 하진 않으니..

하지만 맨 처음 말씀드렸던 newaxis 요놈이 차원을 늘려준다고 했으니 조금 장난을 해보면

위와같이 또 다른 형태의 array를 만들어서 계산이 가능하게 만들수 있습니다.

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

 

그러면...

In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])

덧셈이 잘되네요. 물론 반대로 x2에 newaxis로 차원을 추가해도 결과는 동일 하겠습니다./

 

 

세번째,

아.. array라는 단순한 녀석을 좀 더 고차원으로 만들고 싶다면??...

그렇다면 위에서 해봤던 것의 응용 연장선으로 아래와 한번 이상 사용하면 2차 이상의 array를 만들어낼수 있습니다.

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)

참 쉽죠?? :)

 

 

 

reshape vs newaxis ?

그런데 여기서 python이나 matlab등에 경험이 있으신 분들은

reshape라는 기능을 쓰면 되지 않느냐라고 반문 하실수 있겠네요.

하지만 reshape는 변환전 차원의 합과 변환후 차원의 합이 같아야 합니다.

(4,1)을 변환한다는 기준으로 (2,2)는 reshape 가능한데 (4,1)을 (3,3)으로 바꿀수는 없다는 게 제약이 있는 거죠.

* 4개의 원소를 2by2로 재배열한다는 느낌이 reshape인겁니다. 없는 걸 만들어내는 놈은 아닌거죠.


newaxis = None

그리고 newaxis는 None과 같습니다.

newaxis가 생각 안나면 None을 써도 무방하다는 이야기 입니다..

In [13]: (np.newaxis) is None
Out[13]: True

'CS 잡지식' 카테고리의 다른 글

CVCS vc VCS vs DVCS(Feat. GitHub, Git)  (0) 2024.01.15
모멘트(moment)  (0) 2024.01.12
Gistory(feat. .git 파일 분석 툴)  (1) 2024.01.03
git reset(feat. commit된 버전을 삭제)  (1) 2024.01.03
git log, git diff(feat. git log -p)  (2) 2024.01.03