Post

[Numpy] 행렬 축 바꾸기, 차원 늘리기, 합치기

Numpy에서 행렬 축을 바꾸는 방법에 대해 알아보자.
Keywords : .T, np.transpose(), np.expand_dims(), np.vstack(), np.hstack(), np.concatenate()

✅ 2차원 전치행렬

2차원 numpy array의 전치행렬은 .T attribute와 np.transpose(a) method로 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

a = np.arange(10).reshape(2, 5)
b = a.T
c = np.transpose(a)

print("a.shape :", a.shape, end='\n\n')
print(a)

print('-'*30)

print("b.shape :", b.shape, end='\n\n')
print(b)

print('-'*30)

print("c.shape :", c.shape, end='\n\n')
print(c)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a.shape : (2, 5)

[[0 1 2 3 4]
 [5 6 7 8 9]]
------------------------------
b.shape : (5, 2)

[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]
------------------------------
c.shape : (5, 2)

[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]

✅ 3차원 이상 행렬 축 바꾸기

3차원 이상의 numpy array에도 .T attribute가 존재하지만, 자유도가 높은(원하는 대로 축을 바꿀 수 있는) np.transpose()를 이용하면 된다.

특히 딥러닝의 경우 input 데이터가 (데이터 개수, 세로, 가로, depth) 형태로 들어가게 되는데, 중요한 점은 데이터의 개수가 제일 앞에 위치한다는 것이다. 하지만 종종 데이터를 보면 데이터의 개수가 제일 뒤에 있는 경우가 있는데, 이런 경우에 `np.transpose()`로 데이터의 shape을 맞춰주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

v = 32 * 32 * 3 * 100
a = np.arange(v).reshape(32, 32, 3, 100)
b = a.T
c = np.transpose(a, (3, 0, 1, 2))

print("a.shape :", a.shape)
print('-'*30)

print("b.shape :", b.shape)
print('-'*30)

print("c.shape :", c.shape)
1
2
3
4
5
a.shape : (32, 32, 3, 100)
------------------------------
b.shape : (100, 3, 32, 32)
------------------------------
c.shape : (100, 32, 32, 3)

✅ 차원 추가

numpy array에서 차원 추가는 np.expand_dims() 함수로 가능하다. np.expand_dims() 대신에 x[np.newaxis, :]와 같이 슬라이싱 방법으로도 가능하다.

1
2
3
4
5
6
7
8
9
import numpy as np
v = 5 * 28 * 28
a = np.arange(v).reshape((5, 28, 28))
b = np.expand_dims(a, axis=-1)
c = a[:, :, :, np.newaxis]

print("a.shape :", a.shape)
print("b.shape :", b.shape)
print("c.shape :", c.shape)
1
2
3
a.shape : (5, 28, 28)
b.shape : (5, 28, 28, 1)
c.shape : (5, 28, 28, 1)

np.expand_dims()의 axis에는 튜플 형태로 넣을 수도 있다.

1
2
3
4
5
6
7
import numpy as np
v = 2 * 3
a = np.arange(v).reshape((2, 3))
b = np.expand_dims(a, axis=(0, 1))

print("a.shape :", a.shape)
print("b.shape :", b.shape)
1
2
a.shape : (2, 3)
b.shape : (1, 1, 2, 3)

사실 np.newaxis는 None과 같으므로 x[None, :]과 같이 사용해도 무방하다.

1
print(np.newaxis == None)
1
True

✅ numpy array 합치기

numpy array를 합치는 방법으로는 np.vstack(), np.hstack(), np.concatenate()가 있다.

  • np.vstack() : 세로로 합치기
  • np.hstack() : 가로로 합치기
  • np.concatenate() :
    • axis = 0 : vstack
    • axis = 1 : hstack

✔️ np.vstack()

세로로 합치기. 2차원으로 생각하면 행이 증가하는 형태로 첫 번째 index를(0) 제외한 나머지 shape이 동일해야 한다.

1
2
3
4
5
6
import numpy as np
a = np.array([1,2,3])
b = np.array([5,7,8])
c = np.vstack((a,b))
print(c)
print('c.shape :', c.shape)
1
2
3
[[1 2 3]
 [5 7 8]]
c.shape : (2, 3)
1
2
3
4
5
6
v1 = 2 * 3 * 4
v2 = 5 * 3 * 4
a = np.arange(v1).reshape((2, 3, 4))
b = np.arange(v2).reshape((5, 3, 4))
c = np.vstack((a, b))
print('c.shape :', c.shape)
1
c.shape : (7, 3, 4)

✔️ np.vstack()

가로로 합치기. 2차원으로 생각하면 열이 증가하는 형태로 2번째 index를(1) 제외한 나머지 shape이 동일해야 한다.

1
2
3
4
5
6
7
8
import numpy as np
a = np.array([[1],[2],[3]])
b = np.array([[5],[7],[8]])
c = np.hstack((a,b))
print(c)
print('a.shape :', a.shape)
print('b.shape :', b.shape)
print('c.shape :', c.shape)
1
2
3
4
5
6
[[1 5]
 [2 7]
 [3 8]]
a.shape : (3, 1)
b.shape : (3, 1)
c.shape : (3, 2)
1
2
3
4
5
6
v1 = 2 * 3 * 4
v2 = 2 * 5 * 4
a = np.arange(v1).reshape((2, 3, 4))
b = np.arange(v2).reshape((2, 5, 4))
c = np.hstack((a, b))
print('c.shape :', c.shape)
1
c.shape : (2, 8, 4)

✔️ np.concatenate()

axis 옵션으로 방향을 설정 할 수 있다. axis=0 : 세로 (vstack), axis=1 : 가로 (hstack)

1
2
3
4
5
6
import numpy as np
a = np.array([[1,2,3]])
b = np.array([[5,7,8]])
c = np.concatenate((a,b), axis=0)
print(c)
print('c.shape :', c.shape)
1
2
3
[[1 2 3]
 [5 7 8]]
c.shape : (2, 3)
1
2
3
4
5
a = np.array([[1],[2],[3]])
b = np.array([[5],[7],[8]])
c = np.concatenate((a,b), axis=1)
print(c)
print('c.shape :', c.shape)
1
2
3
4
[[1 5]
 [2 7]
 [3 8]]
c.shape : (3, 2)
This post is licensed under CC BY 4.0 by the author.

비즈니스 관점의 모델 평가

-