일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- GUI
- MariaDB
- 파이토치
- 딥러닝
- 장고
- Computer Vision
- Python
- Django
- 컴퓨터 비전
- Web Programming
- FLASK
- 논문 리뷰
- OpenCV
- 그래픽 유저 인터페이스
- Tkinter
- k8s
- kubernetes
- 웹 프로그래밍
- POD
- 데이터베이스
- Docker
- vue.js
- tensorflow
- pytorch
- 텐서플로우
- paper review
- Deep Learning
- 파이썬
- numpy
- yaml
- Today
- Total
Maxima's Lab
[Python] 1-2. Numpy (넘파이) - ndarray & expand_dims, append, stack 본문
[Python] 1-2. Numpy (넘파이) - ndarray & expand_dims, append, stack
Minima 2022. 6. 19. 23:05안녕하세요, 오늘은 Numpy (넘파이)의 expand_dims, append, stack 함수에 대해서 알아보겠습니다.
▶ expand_dims() : Array (배열)의 shape (형태)를 확장시키는 함수
random.randint() 함수를 이용하여 size = (100, 64, 64) 이고 0 이상 256 미만의 임의의 값을 원소로 갖는 배열을 생성하여, 해당 배열에 expand_dims() 함수를 적용해보겠습니다.
import numpy as np
array_a = np.random.randint(0, 256, (100, 64, 64))
print(array_a.shape)
array_a_axis_0 = np.expand_dims(array_a, axis=0)
print(array_a_axis_0.shape)
array_a_axis_1 = np.expand_dims(array_a, axis=1)
print(array_a_axis_1.shape)
array_a_axis_2 = np.expand_dims(array_a, axis=2)
print(array_a_axis_2.shape)
array_a_axis_3 = np.expand_dims(array_a, axis=3)
print(array_a_axis_3.shape)
array_a_axis_last = np.expand_dims(array_a, axis=-1)
print(array_a_axis_last.shape)
Output :
(100, 64, 64)
(1, 100, 64, 64)
(100, 1, 64, 64)
(100, 64, 1, 64)
(100, 64, 64, 1)
(100, 64, 64, 1)
최초에 shape = (100, 64, 64) 인 3차원 배열을 생성하였습니다. 차원을 확장하는 함수는 추후 모델의 Input의 shape을 동일하게 맞추어 줄 때 유용하게 사용할 수 있는 함수입니다.
기존에 생성한 배열이 3차원이기 때문에, 0번째 축, 1번째 축, 2번째 축, 3번째 축을 기준으로 차원을 확장시킬 수 있습니다.
(여기서, axis=-1로 설정하면, 3번째 축을 기준으로 차원을 확장시키는 것과 동일한 결과를 얻을 수 있습니다.)
▶ append() : 특정 axis (축)들을 기준으로 기존의 배열에 새로운 배열을 추가하는 함수
특정 axis (축)들을 기준으로 기존 배열에 추가하는 함수이므로, 해당 축을 제외한 나머지 차원들의 shape은 동일함을 유지해야 합니다.
다음은 서로 다른 2개의 array를 apped() 함수를 적용하는 예시입니다.
import numpy as np
array_a = np.random.randint(0, 256, (100, 64, 64))
array_b = np.random.randint(0, 256, (50, 64, 64))
print(array_a.shape)
print(array_b.shape)
array_append = np.append(array_a, array_b, axis=0)
print(array_append.shape)
Output :
(100, 64, 64)
(50, 64, 64)
(150, 64, 64)
배열 a와 배열 b의 shape은 각각 (100, 64, 64), (50, 64, 64)로 다르지만, 0번째 축을 기준으로 생각하였을 때 나머지 shape은 동일하다고 볼수 있습니다. 따라서, 0번째 축을 기준으로 apped() 함수를 적용한 결과를 (150, 64, 64)의 shape으로 얻을 수 있습니다.
다음은 1번째 축을 기준으로 append() 함수를 적용하는 예시입니다.
import numpy as np
array_c = np.random.randint(0, 256, (50, 12, 64))
array_d = np.random.randint(0, 256, (50, 64, 64))
print(array_c.shape)
print(array_d.shape)
array_append = np.append(array_c, array_d, axis=1)
print(array_append.shape)
Output :
(50, 12, 64)
(50, 64, 64)
(50, 76, 64)
배열 c와 배열 d는 1번째 축을 기준으로 생각하였을 때, 나머지 shape은 동일하기 때문에 append() 함수를 적용할 수 있는 자격을 갖췄다고 볼 수 있습니다. 결과적으로 배열 c와 배열 d에 append() 함수를 적용하게 되면, (50, 76, 64)의 shape으로 배열을 얻을 수 있습니다.
정리하자면, 특정 축을 기준으로 append() 함수를 적용할 때는, 해당 축을 기준으로 나머지 축들의 shape은 동일해야 하며, 함수 적용을 통해 얻은 결과는 특정 축에 대한 Value만 변경되며, 나머지 축들의 shape은 동일하게 유지된다는 것을 확인할 수 있습니다.
▶ stack(), vstack(), hstack(), dstack(), column_stack(), row_stack() : 특정 축을 기준으로 기존 배열들을 쌓아서 새로운 array (배열)을 만드는 함수
▷ stack() : 기존 배열을 특정 축을 기준으로 다시 쌓는 함수
다음은 2차원 배열을 생성하여 axis = 0, axis = 1을 기준으로 stack() 함수를 적용한 예시입니다.
import numpy as np
array_a = np.array([[1, 2, 3], [4, 5, 6]])
print(array_a.shape)
array_stack_axis_0 = np.stack(array_a, axis=0)
print(array_stack_axis_0.shape)
array_stack_axis_1 = np.stack(array_a, axis=1)
print(array_stack_axis_1.shape)
Output :
(2, 3)
(2, 3)
(3, 2)
axis = 0을 기준으로 stack() 함수를 적용하면, 최초의 배열인 array_a와 동일한 배열이 생성되고, axis = 1을 기준으로 stack() 함수를 적용하면, 기존 첫번째 축이 axis = 1의 축이 되고, 나머지 축들은 0번째 축을 기준으로 순차적으로 축이 적용되어 새로운 shape의 배열을 생성하게 됩니다.
다음은 4차원 배열을 생성하여, axis = 0, axis = 1, axis = 2, axis = 3, axis = -1에 따라 stack() 함수를 적용한 결과는 다음과 같습니다.
import numpy as np
array_a = np.random.randint(0, 256, (100, 64, 64, 3))
print(array_a.shape)
array_stack_axis_0 = np.stack(array_a, axis=0)
print(array_stack_axis_0.shape)
array_stack_axis_1 = np.stack(array_a, axis=1)
print(array_stack_axis_1.shape)
array_stack_axis_2 = np.stack(array_a, axis=2)
print(array_stack_axis_2.shape)
array_stack_axis_3 = np.stack(array_a, axis=3)
print(array_stack_axis_3.shape)
array_stack_axis_last = np.stack(array_a, axis=-1)
print(array_stack_axis_last.shape)
Output :
(100, 64, 64, 3)
(100, 64, 64, 3)
(64, 100, 64, 3)
(64, 64, 100, 3)
(64, 64, 3, 100)
(64, 64, 3, 100)
▷ vstack() : 서로 다른 두 배열을 수직으로 쌓는 함수
다음은 서로 다른 4차원 배열을 생성해서 vstack() 함수를 적용한 예시입니다.
import numpy as np
array_a = np.random.randint(0, 256, (100, 64, 64, 3))
print(array_a.shape)
array_b = np.random.randint(0, 256, (50, 64, 64, 3))
print(array_b.shape)
array_vstack = np.vstack((array_a, array_b))
print(array_vstack.shape)
Output :
(100, 64, 64, 3)
(50, 64, 64, 3)
(150, 64, 64, 3)
vstack() 함수를 적용하기 위해 주의할 사항은 2가지 입니다.
- 서로 다른 array에 대해 차원이 동일해야 하며, 0번째 축을 제외한, 나머지 축들의 shape은 동일해야 합니다.
- np.vstack() 함수의 input으로 tuple의 형태를 사용해야 합니다.
▷ hstack() : 서로 다른 두 배열을 수평으로 쌓는 함수
다음은 서로 다른 4차원 배열을 생성해서 hstack() 함수를 적용한 예시입니다.
import numpy as np
array_a = np.random.randint(0, 256, (100, 32, 64, 3))
print(array_a.shape)
array_b = np.random.randint(0, 256, (100, 64, 64, 3))
print(array_b.shape)
array_hstack = np.hstack((array_a, array_b))
print(array_hstack.shape)
Output :
(100, 32, 64, 3)
(100, 64, 64, 3)
(100, 96, 64, 3)
hstack() 함수를 적용하기 위해 주의할 사항은 2가지 입니다.
- 서로 다른 array에 대해 차원이 동일해야 하며, 1번째 축을 제외한, 나머지 축들의 shape은 동일해야 합니다.
- np.hstack() 함수의 input으로 tuple의 형태를 사용해야 합니다.
▷ column_stack() : 서로 다른 1차원 배열들을 열벡터의 형태로 쌓아 2차원 배열을 만드는 함수
다음은 서로 다른 1차원 배열을 생성해서 column_stack() 함수를 적용한 예시입니다.
유사하게, 서로 다른 1차원 배열의 shape이 동일해야 하며, column_stack() 함수 적용 시 tuple의 형태로 input을 사용해야 합니다.
import numpy as np
array_a = np.random.randint(0, 10, (3))
print(array_a.shape)
print(array_a.ndim)
array_b = np.random.randint(0, 10, (3))
print(array_b.shape)
print(array_b.ndim)
array_column_stack = np.column_stack((array_a, array_b))
print(array_column_stack.shape)
Output :
(3,)
1
(3,)
1
(3, 2)
print(array_a)
print(array_b)
print(array_column_stack)
Output :
[7 9 4]
[8 3 9]
[[7 8]
[9 3]
[4 9]]
▷ row_stack() : 서로 다른 1차원 배열들을 행벡터의 형태로 쌓아 2차원 배열을 만드는 함수
다음은 서로 다른 1차원 배열을 생성해서 row_stack() 함수를 적용한 예시입니다.
유사하게, 서로 다른 1차원 배열의 shape이 동일해야 하며, row_stack() 함수 적용 시 tuple의 형태로 input을 사용해야 합니다.
import numpy as np
array_a = np.random.randint(0, 10, (3))
print(array_a.shape)
print(array_a.ndim)
array_b = np.random.randint(0, 10, (3))
print(array_b.shape)
print(array_b.ndim)
array_row_stack = np.row_stack((array_a, array_b))
print(array_row_stack.shape)
Output :
(3,)
1
(3,)
1
(2, 3)
print(array_a)
print(array_b)
print(array_row_stack)
Output :
[4 8 3]
[6 7 1]
[[4 8 3]
[6 7 1]]
여기까지, Numpy (넘파이)의 expand_dims(), append(), stack() 함수들에 대해서 알아보았습니다.
'Python > Numpy' 카테고리의 다른 글
[Python] 1-1. Numpy (넘파이) - ndarray & reshape (0) | 2022.06.17 |
---|