본문 바로가기
Python/Build setting

[Numpy]넘파이 shape 변경

by 소소한 혜밍씨 2022. 8. 30.

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 병합을 할 때는 차원이 추가되면서 병합이 되는 것을 확인할 수 있다.

 

 

 

 

 

댓글