2019. 4. 2. 16:29ㆍProgramming Tutorial/Python
필자의 소개는 다음으로 미루고
오후쯤인가 scikit learn이라는 machine learning library의 tutorial을 막 보기시작하다가 저도 궁금해서 찾아봤던
내용에 대해서 남겨볼까 합니다.
아주 잘 정리되어 있는 medium 블로그가 때마침 있기도 하니 겸사겸사..
(영어공부가 목적은 아닙니다.)
아마 이 글을 읽게 될 독자분들도 저와 비슷한 궁금증으로 유입되셨으리라 보고.. 본론으로 들어가지요.
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자리는 공란입니다.
vector로 보고 indexing을 한다던지 연산을 한다던지 해도 껄끄러운 상태겠네요.
여기에 아래와 같이 장난을 처봅시다.
그러면 아주 간단하게 해결 됩니다.
# 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])
Vale Error.. 어찌보면 당연하시오. 수학적으로도 성립을 하진 않으니..
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]])
위와같이 또 다른 형태의 array를 만들어서 계산이 가능하게 만들수 있습니다.
그러면...
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
음 간단히 쓰려고 했는데 꽤 길어졌네요.
자 여러분들 커피한잔 하시고 다시 배우러 고고..
'Programming Tutorial > Python' 카테고리의 다른 글
[numpy #5] 열벡터를 만들어 봅시다. Making column vector (0) | 2019.06.05 |
---|---|
[파이썬] string 자료형의 Punctuation 없애는 방법 (0) | 2019.05.15 |
[numpy #3] Broad casting에 대해서 알아보자 (0) | 2019.04.17 |
[pandas#1] Data는 정리하고 청소하는 것부터... (0) | 2019.04.05 |
[numpy #2] numpy의 기초에 대해서 알아보자! (0) | 2019.04.04 |