Numpy array의 차원을 변경 및 재구조화할 때 reshape()의 함수를 사용하게 된다.
reshape외에도 차원을 변경하기 위한 다양한 함수가 존재한다.
따라서 차원 재구조화를 위한 다양한 함수를 포스팅 해볼까한다.
먼저, 임의의 numpy array를 만든다.
a = np.arange(24).reshape(2,3,4)
print(a, a.shape)
# 출력
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]] (2, 3, 4)
reshape() 함수
a = a.reshape(4, -1)
print(a, a.shape)
# 출력
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]] (4, 6)
가장 보편적으로 사용하는 차원 재구조화를 위한 함수이다.
그 중 행 이나 열에 -1이 들어간 경우를 볼 수 있다.
이 경우에는 -1 외에 지정된 행이나 열에 맞추고 남은 원소를 추정하여 가변적으로, 혹은 알아서 지정 된다.
np.newaxis
newaxis 는 쉽게 말해서 차원을 늘려준다.
a = a[..., np.newaxis]
print(a, a.shape)
# 출력
[[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]]
[[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]]
[[12]
[13]
[14]
[15]
[16]
[17]]
[[18]
[19]
[20]
[21]
[22]
[23]]] (4, 6, 1)
위의 결과를 그대로 사용할 경우
기존 (4, 6)의 2차원 배열에서 (4, 6, 1)의 3차원 배열로 늘어난 것을 확인할 수 있다.
이러한 원리로 아래와 같이 차원을 늘릴 수 있게 한다.
- 1dim >> 2dim
- 2dim >> 3dim
- 3dim >> 4dim
- 4dim >> 5dim
참고로, 코드블럭 내에 있는 a[..., np.newaxis]의 의미는 a[:, :, np.newaxis]와 같다.
np.expand_dims
위에 기술했던 np.newaxis와 동일하게 작동하는 함수이다.
다만, np.expand_dims을 사용할 때는 추가하고자하는 axis를 같이 적어야 한다.
# 기존 a 의 (4, 6, 1) 배열을 다시 reshape
a = a.reshape(4, 6)
a = np.expand_dims(a, axis=0)
print(a, a.shape)
# 출력
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]] (1, 4, 6)
np.concatenate()
numpy array 에서도 병합을 할 수 있다.
병합을 원하는 축을 np.concatenate 내 파라미터인 axis 를 적용하면 원하는 값을 출력할 수 있다.
# a와 동일한 b를 copy
b = a.copy()
print(b, b.shape)
# 출력
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]] (1, 4, 6)
# a와 b의 마지막 축을 병합
c = np.concatenate((a, b), axis=-1)
print(c, c.shape)
# 출력
[[[ 0 1 2 3 4 5 0 1 2 3 4 5]
[ 6 7 8 9 10 11 6 7 8 9 10 11]
[12 13 14 15 16 17 12 13 14 15 16 17]
[18 19 20 21 22 23 18 19 20 21 22 23]]] (1, 4, 12)
위의 결과는 a (1, 4, 6) 과 b(1, 4, 6)을 병합하여 (1, 4, 12)를 출력한 결과이다.
그렇다면 다른 축을 기준으로 병합하면 어떤 shape을 가질까
c = np.concatenate((a, b), axis=0)
print(c, c.shape)
# 출력
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]] (2, 4, 6)
첫 번째 축을 기준으로 병합한 결과이다.
이렇게 axis 파라미터를 어떻게 설정하느냐에 따라 다양한 병합 결과를 출력할 수 있게 된다.
np.stack()
np.stack은 위에서 사용한 np.concatenate와 비슷하게 병합한 결과를 출력해낸다.
그러나 둘 중 하나는 차원을 추가하면서 병합을 하게 되고
다른 하나는 차원을 추가하지 않고 그대로 병합하므로 이러한 출력은 아래의 코드로 확인 가능하다.
d = np.stack((a, b), axis=-1)
print(d, d.shape)
# 출력
[[[[ 0 0]
[ 1 1]
[ 2 2]
[ 3 3]
[ 4 4]
[ 5 5]]
[[ 6 6]
[ 7 7]
[ 8 8]
[ 9 9]
[10 10]
[11 11]]
[[12 12]
[13 13]
[14 14]
[15 15]
[16 16]
[17 17]]
[[18 18]
[19 19]
[20 20]
[21 21]
[22 22]
[23 23]]]] (1, 4, 6, 2)
d = np.stack((a, b), axis=0)
print(d, d.shape)
# 출력
[[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]]
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]]] (2, 1, 4, 6)
a (1, 4, 6), b (1, 4, 6)의 두 개의 numpy array 를 np.concatenate와 동일한 매커니즘으로
np.stack의 axis 파라미터에 원하는 축 기준을 적용하였다.
출력된 결과 shape은 다음과 같다.
axis=-1를 적용하였을 때
np.concatenate의 결과 shape은 (1, 4, 12)
np.stack의 결과 shape은 (1, 4, 6, 2)
axis=0을 적용하였을 때
np.concatenate의 결과 shape은 (2, 4, 6)
np.stack의 결과 shape은 (2, 1, 4, 6)
따라서, np.concatenate을 사용하여 array 병합을 할 때는 차원이 유지되면서 병합이 되고
np.stack을 사용하여 array 병합을 할 때는 차원이 추가되면서 병합이 되는 것을 확인할 수 있다.
'Python > Build setting' 카테고리의 다른 글
[Numpy]넘파이 연산(Broadcasting) (1) | 2022.08.30 |
---|---|
[Numpy]넘파이 연산(sum) (0) | 2022.08.29 |
[Numpy]넘파이 연산 (0) | 2022.08.29 |
[Numpy]indexing(boolean indexing, fancy indexing) (0) | 2022.08.29 |
[Numpy]넘파이 indexing과 slicing의 차이 (0) | 2022.08.29 |
댓글