[Numpy] 배열 분할하기(np.split)
- Python/Numpy
- 2022. 1. 3.
numpy 에서 배열 분할하는 방법에 대해서 알아보겠습니다.
기본적으로 np.split(array, indices or section, axis=0) 으로 분할합니다.
행렬이 3차원이상이면 수직(vertical), 수평(horizontal), 깊이(depth)로 구성되어 있는데
np.split에서는 수직(행),수평(열)만 가능하기에 깊이로 분할이 불가능합니다.
그렇기 때문에 각각에 대해 다른 대체 메쏘드가 존재합니다.
axis=0 일때는 np.vsplit() 으로 axis=1 일때는 np.hsplit()으로 axis=2 일때는 np.dsplit() 으로 가능합니다.
또한, np.split는 같은 크기로의 분할만 가능합니다.
예를 들어, (4,4) 행렬이라면 같은 크기로 나눌 수 있는 1,2,4에서만 가능합니다.
이를 무시하고 싶다면 즉, 3으로 나누고 싶다면 np.array_split() 메쏘드로 할 수 있습니다.
하지만 없는 걸 생성할 수는 없습니다. (4,4) 행렬을 3으로 나누면 3,1 로 나눠지게 되어서 크기가 다르게 데이터가 나올 수 있기 때문에 필요없는 데이터가 있을 경우 사용합니다.
[배열 분할하기]
행(row)으로 분할하기(np.vsplit(), np.split(axis=0))
수직(행)으로 분할하는 방법입니다.
np.split이나 np.vsplit으로 할 수 있습니다.
np.vsplit(array, indices or section) 으로 되어있고 axis의 정보를 넣지 않아도 됩니다.
행은 axis=0 이고 같은 크기로 분할해야하기 때문에
행렬 (m,n) 이 있다면 m에 의해서 숫자가 결정됩니다.
즉, m의 약수만으로 분할할 수 있습니다.
다음과 같은 배열을 행으로 분할하려고 한다면 6의 약수인 1,2,3,6 으로만 가능합니다.
참고로, 1로 하면 c 그대로 나오기 때문에 의미가 없습니다.
c = np.arange(18).reshape(6,3)
c
np.split(c,2,axis=0) # np.vsplit(c,2)
수직선을 여러개 넣는 방식도 있습니다.
리스트로써 값을 넣어주면 가능합니다.
예를 들어 [1,4] 를 한다면 1번째 자리와 4번째 자리에 수직선을 넣어 분할합니다.
따라서 1, 234, 56으로 분할됩니다.
np.split(c,[1,4],axis=0) # np.vsplit(c,[1,4])
열(column)으로 분할하기(np.hsplit(),np.split(axis=1))
행으로 분할하는 원리와 동일합니다.
np.split으로 한다면 axis=1 로 바뀌는 것과 열에 해당하는 숫자에 따라 나눠야 하는게 다르고 np.hsplit을 써야 하는게 다릅니다.
행에서 했던 예로 그대로 쓰면 1,3으로만 나눌 수 있습니다.
np.split(c,3,axis=1) # np.hsplit(c,3)
행 분할과 마찬가지로 여러 수평선으로 나눌 수 있습니다.
np.split(c,[2],axis=1)
깊이(axis=2)로 분할하기(np.dsplit())
깊이로 하는 방법입니다. 차원은 3차원이상이어야 가능하고 np.split으로 할 수가 없습니다.
그래서 np.dsplit을 이용합니다.
b = np.arange(16).reshape(2,2,4)
b
b에 적용하면 axis=2 이어야 하니 4의 약수인 1,2,4 만 가능합니다.
np.dsplit(b,2)
선을 넣어서 분할하고 싶다면 리스트를 넣어 적용합니다.
np.dsplit(b,[1,3])
다른 크기로 배열 분할(np.array_split())
np.split는 같은 크기로만 분할이 가능했습니다. 다른 크기로 분할하고 싶다면 np.array_split()를 씁니다. 하지만 우선적으로 원하는 크기로 분할해 데이터를 확보하는 정도라서 깔끔하게 크기를 맞추고 나머지는 버릴 때 사용합니다.
np.array_split(array, indices or section, axis=0) 으로 구성되어 있습니다.
np.split와 비슷하고 indices의 제약이 없는 것 뿐입니다.
위에서 보인 c는 (6,3)의 행렬로 행으로 4로 나눌 수가 없습니다.
하지만 np.array_split()을 사용하면 가능합니다.
c = np.arange(18).reshape(6,3)
c
np.array_split(c,4,axis=0)
보시다시피 2,2,1,1 로 나눠졌습니다. 4개로 나눠달라는 것이기 때문에 선제적으로 2,2 로 나눈 후 나머지 2개를 다시 2개로 나누는 방식으로 나눠집니다. 그래서 리턴할때 4//6+1 이나 4//6 으로 나눠집니다.
여기서 //는 4로 6을 나눴을때 몫만 취하는 걸 얘기합니다.
일반화하면 n개의 행을 I 개로 분할하고 싶다면 I//n+1 이나 I//n 으로 나눠집니다. 우선적으로 I//n+1 로 하고 나머지에 한해서 I//n으로 나눠집니다.
'Python > Numpy' 카테고리의 다른 글
NumPy를 활용한 다차원 배열의 평탄화 (0) | 2023.06.22 |
---|---|
[Numpy] 배열(array) 합치기(np.concatenate) (0) | 2022.01.05 |
[Numpy] 분포함수(distribution) (0) | 2021.11.20 |
[numpy] 행렬식, 고유값 계산하기(np.linalg) (0) | 2021.11.06 |
[Numpy] 소수점 반올림하기(np.set_printoptions) (0) | 2021.09.28 |