4.10.12 쪼개고 나누기: 배열 분할의 기본 np.split()

배열을 요리조리 레고 블록처럼 합치는 방법을 마스터했으니, 이제 완성된 배열(블록)을 다시 조각조각 잘라내는 방법(Split)을 배워보겠습니다.

가장 기본이 되는 함수는 np.split() 입니다. 이 함수는 배열을 토막 내어 분할된 부분 배열들의 파이썬 리스트(List) 형태로 반환해줍니다.


[1단계] 똑같은 크기로 n등분 하기 (단순 분할)

첫 번째 사용법은 np.split(배열, n) 형태로 넘겨주어, 전체 배열을 정확히 n개로 똑같이 나누어 등분하는 것입니다.

np.split n등분 분할

import numpy as np

# 0.0 부터 8.0 까지 9개의 원소가 있는 1차원 배열
x = np.arange(9.0)
print("원본 배열 x:", x)

# x를 정확히 3등분 합니다.
s = np.split(x, 3)

print("\n🔪 3등분 결과:", s)
print("데이터 타입:", type(s))  # 결괏값이 리스트(List)형 태임에 주목하세요!
print("첫 번째 조각:", s[0])

[실행 결과]

원본 배열 x: [0. 1. 2. 3. 4. 5. 6. 7. 8.]

🔪 3등분 결과: [array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7., 8.])]
데이터 타입: <class 'list'>
첫 번째 조각: [0. 1. 2.]

🚨 [주의] 똑같이 나누어떨어지지 않으면 얄짤없이 에러! 9개의 원소를 4개로 쪼개달라고 하면 어떻게 될까요? Numpy는 “똑같이 등분할 수 없는데 어쩌라고?” 라며 쿨하게 에러(ValueError)를 뱉어냅니다!

np.split(x, 4)
# ValueError: array split does not result in an equal division

[2단계] 칼집 인덱스로 내 맘대로 자르기 (불균등 분할)

두 번째 사용법이 진짜 묘미입니다. 위에서 본 에러를 피하고 싶거나 내 맘대로 크기를 다르게 잘라내고 싶다면 두 번째 인자로 숫자 하나가 아닌 리스트(배열) 형태의 인덱스 번호들을 넘겨주면 됩니다.

이 숫자들은 “해당 인덱스 번호의 요소 바로 앞에서 칼질을 해라!” 라는 뜻을 가집니다.

칼집 인덱스로 분할

x = np.arange(1, 10) # 1부터 9까지 9개 원소
print("원본 배열 x:", x)

# [2, 6] 위치에 칼을 들이댑니다!
# 1) 처음부터 인덱스 2 앞까지 자르고 (x[:2])
# 2) 인덱스 2부터 인덱스 6 앞까지 자르고 (x[2:6])
# 3) 인덱스 6부터 끝까지 남습니다. (x[6:])
result = np.split(x, [2, 6])
print("\n🔪 불균등 분할 결과:", result)

[실행 결과]

원본 배열 x: [1 2 3 4 5 6 7 8 9]

🔪 불균등 분할 결과: [array([1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]

✅ 첨자가 너무 멀어서 배열 끝을 넘어가 버린 칼질이라면? 빈 배열 반환! 원소 6개짜리 짧은 배열을 여러 군데에서 마구잡이로 자르라고([2, 3, 4, 6]) 명령하면 어떻게 될까요? 마지막 조각들은 잘라낼 내용물이 아예 없어서 비어있는 깡통 배열(array([], dtype=int32))로 툭툭 떨어지게 됩니다.

y = np.arange(10, 61, 10) # [10 20 30 40 50 60] (6개 원소)

result_empty = np.split(y, [2, 3, 4, 6])
print("빈 배열이 섞인 분할 (6부터 끝나는 지점까지는 빈 공간):")
for arr in result_empty:
    print(arr)

[3단계] 2차원 배열과 만난 분할 (axis 파라미터 제어)

split() 함수에 axis 인자를 조절해주면, 2차원 공간의 배열을 수평(세로축 기준)으로 썰어버릴지, 수직(가로축 기준)으로 썰어버릴지 마음대로 정할 수 있습니다.

3-1. 수평 분리 (axis=1) -> 이후에 배울 hsplit 함수와 100% 동일!

axis=1은 행(가로층)은 그대로 유지하고, 열(세로 기둥)을 위에서 아래로 내리쳐 자르는 느낌입니다. 12개의 열 기둥이 있다면 이를 3등분(4묶음씩) 할 수 있습니다.

np.split 2차원 axis 칼질 원리

# 2행 12열 크기의 큰 2차원 배열
a = np.arange(24).reshape(2, 12)

# 열 방향(axis=1)으로 3등분 칼질!
part_axis1 = np.split(a, 3, axis=1)
print("\n🔪 3등분 (axis=1) 부분 배열 출력:")
print(part_axis1[0]) # 첫 번째 조각

3-2. 수직 분리 (axis=0) -> 이후에 배울 vsplit 함수와 100% 동일!

axis=0 (설정 기본값)은 아파트 층수 단위로 아래를 향하며 가로칼질을 합니다.

np.split 2차원 axis=0 가로 칼질 원리

# 6행 4열 2차원 배열
b = np.arange(24).reshape(6, 4)

# 행 방향(axis=0)으로 3등분 층 분리! 
part_axis0 = np.split(b, 3, axis=0) # axis=0 매개변수는 생략 가능합니다.
print("\n🔪 3등분 (axis=0) 부분 배열 출력:")
print(part_axis0[0]) # 첫 번째 조각
서브목차