[Python] numpy 배열을 여러개의 하위 배열로 분할하기 (split an array into sub-arrays)
Python 분석과 프로그래밍/Python 데이터 전처리 2018. 5. 22. 13:51이번 포스팅에서는 Python NumPy 배열을 여러개의 하위 배열로 분할하는 방법을 소개하겠습니다.
- 한 개의 배열을 수평 축(열 방향, column-wise)으로 여러 개의 하위 배열로 분할하기
- np.hsplit(x, 3), np.hsplit(x, (2, 4))
- np.split(x, 3, axis=1), np.split(x, (2, 4), axis=1)
- 한 개의 배열을 수직 축(행 방향, row-wise)으로 여러 개의 하위 배열로 분할하기
- np.vsplit(x, 3), np.vsplit(x, (1, 2))
- np.split(x, 3, axis=0), np.split(x, (1, 2), axis=0)
[ Python NumPy 배열 분할하기 ]
간단한 예를 들어서 설명하겠습니다.
(1) 한 개의 배열을 수평 축(열 방향, column-wise)으로 여러 개의 하위 배열로 분할하기 |
In [1]: import numpy as np In [2]: x = np.arange(18).reshape(3, 6) In [3]: x Out[3]: array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]) |
아래의 4가지 함수 모두 동일한 결과를 반환합니다.
- np.hsplit(x, 3) : x 배열을 수평 축(열 방향, column-wise)으로 3개의 배열로 분할
- np.hsplit(x, (2, 4)) : x 배열을 수평 축(열 방향, colomn-wise)의 x[:,0:2], x[:,2:4], x[:,4:6] 위치의 원소를 가지는 3개의 배열로 분할
np.hsplit(x, 3) |
np.hsplit(x, (2, 4)) |
In [4]: np.hsplit(x, 3) Out[4]: [array([[ 0, 1], [ 6, 7], [12, 13]]), array([[ 2, 3], [ 8, 9], [14, 15]]), array([[ 4, 5], [10, 11], [16, 17]])] |
In [5]: np.hsplit(x, (2, 4)) Out[5]: [array([[ 0, 1], [ 6, 7], [12, 13]]), array([[ 2, 3], [ 8, 9], [14, 15]]), array([[ 4, 5], [10, 11], [16, 17]])] |
- np.split(x, 3, axis=1) = np.hsplit(x, 3) 와 동일
- np.split(x, (2, 4), axis=1) = np.hsplit(x, (2, 4)) 와 동일
np.split(x, 3, axis=1) |
np.split(x, (2, 4), axis=1) |
In [6]: np.split(x, 3, axis=1) Out[6]: [array([[ 0, 1], [ 6, 7], [12, 13]]), array([[ 2, 3], [ 8, 9], [14, 15]]), array([[ 4, 5], [10, 11],
[16, 17]])] |
In [7]: np.split(x, (2, 4), axis=1) Out[7]: [array([[ 0, 1], [ 6, 7], [12, 13]]), array([[ 2, 3], [ 8, 9], [14, 15]]), array([[ 4, 5], [10, 11],
[16, 17]])] |
아래 처럼 하나의 배열을 3개로 분할했을 때, 각 하위 배열을 x1, x2, x3 에 할당할 수 있습니다.
In [8]: x1, x2, x3 = np.hsplit(x, 3) In [9]: x1 Out[9]: array([[ 0, 1], [ 6, 7], [12, 13]]) In [10]: x2 Out[10]: array([[ 2, 3], [ 8, 9], [14, 15]]) In [11]: x3 Out[11]: array([[ 4, 5], [10, 11],
[16, 17]])
|
(2) 한 개의 배열을 수직 축(행 방향, row-wise)으로 여러 개의 하위 배열로 분할하기 |
In [2]: x = np.arange(18).reshape(3, 6) In [3]: x Out[3]: array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]) |
- np.vsplit(x, 3) : x배열을 수직 축 (행 방향, row-wise) 으로 3개의 하위 배열로 분할하기
- np.vsplit(x, (1, 2)) : x배열을 수직 축 (행 방향, row-wise) 기준으로 x[0:1, :], x[1:2, :], x[2:3, :] 위치의 원소를 가지는 3개의 하위 배열로 분할하기
np.vsplit(x, 3) |
np.vsplit(x, (1, 2)) |
In [12]: np.vsplit(x, 3) Out[12]: [array([[0, 1, 2, 3, 4, 5]]), array([[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17]])] |
In [13]: np.vsplit(x, (1, 2)) Out[13]: [array([[0, 1, 2, 3, 4, 5]]), array([[ 6, 7, 8, 9, 10, 11]]), array([[12, 13, 14, 15, 16, 17]])] |
- np.split(x, 3, axis=0) = np.vsplit(x, 3) 과 동일
- np.split(x, (1, 2), axis=0) = np.vsplit(x, (1, 2)) 와 동일
np.split(x, 3, axis=0) |
np.split(x, (1, 2), axis=0) |
In [14]: np.split(x, 3, axis=0) Out[14]: [array([[0, 1, 2, 3, 4, 5]]), array([[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17]])] |
In [15]: np.split(x, (1, 2), axis=0) Out[15]: [array([[0, 1, 2, 3, 4, 5]]), array([[ 6, 7, 8, 9, 10, 11]]),
array([[12, 13, 14, 15, 16, 17]])] |
저는 np.hsplit()과 np.vsplit() 이 행과 열 중에서 어디를 기준으로 분할이 되는 건지 자꾸 헷갈리네요. 직관적인 코드 가독성면에서는 np.split(x, n, axis=0), np.split(x, n, axis=1) 처럼 axis = 0 or 1 로 표기해주는 방식이 저한테는 더 이해하기가 쉽네요.
많은 도움이 되었기를 바랍니다.
'Python 분석과 프로그래밍 > Python 데이터 전처리' 카테고리의 다른 글
[Python pandas] 다수개의 범주형자료로 가변수 만들기 (dummy variable) (2) | 2018.08.21 |
---|---|
[Python NumPy] 선형대수 함수 (Linear Algebra) (0) | 2018.08.15 |
[Python] numpy 배열 외부 파일로 저장하기(save), 외부 파일을 배열로 불러오기(load) (4) | 2018.05.21 |
[Python] numpy array 정렬, 거꾸로 정렬, 다차원 배열 정렬 (2) | 2018.05.18 |
[Python] numpy 최소, 최대, 조건 색인값 : np.argmin(), np.argmax(), np.where() (7) | 2018.05.17 |