배열 조작
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.
배열 조작
개요
배열 조작(Array Manipulation)은 데이터과학에서를 효과적으로 처리하고 분석하기 위해 필수적인 기술 중 하나입니다. 배열은 숫자, 문자열, 객체 등 다양한 데이터를 순차적으로 저장하는 자료구조로, 특히 수치 계산 및 통계 분석에서 중심적인 역할을 합니다. 데이터과학에서는 주로 넘파이(NumPy)와 같은 라이브러리를 활용하여 다차원 배열(ndarray)을 조작하며, 이는 데이터 전처리, 특성 공학(Feature Engineering), 모델 학습 전 단계에서 매우 중요한 작업입니다.
배열 조작은 단순한 데이터 접근을 넘어 배열의 형태 변경, 결합, 분할, 슬라이싱, 인덱싱, 수학적 연산 등을 포함하며, 효율적인 메모리 사용과 빠른 계산 성능을 위해 벡터화된 연산을 지향합니다.
주요 배열 조작 기법
1. 배열 생성과 초기화
배열 조작의 첫 단계는 배열을 생성하는 것입니다. 넘파이를 사용하면 다양한 방식으로 배열을 초기화할 수 있습니다.
import numpy as np
# 0으로 채워진 배열 생성
zeros = np.zeros((3, 4)) # 3x4 크기의 0 배열
# 1로 채워진 배열 생성
ones = np.ones((2, 3))
# 특정 값으로 채워진 배열
full = np.full((2, 2), 7) # 2x2 배열, 모든 요소가 7
# 단위 행렬 생성
identity = np.eye(3) # 3x3 단위 행렬
# 범위 기반 배열 생성
arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
2. 배열의 형태 변경 (Reshaping)
배열의 차원을 변경하는 작업은 데이터를 모델에 입력하기 전에 매우 흔히 사용됩니다. [reshape](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EB%B3%80%ED%99%98/reshape)()
함수를 통해 배열의 모양을 재구성할 수 있습니다.
a = np.array([1, 2, 3, 4, 5, 6])
b = a.reshape(2, 3) # 2x3 배열로 변경
주의: 원소 수가 유지되어야 하며, 그렇지 않으면
ValueError
가 발생합니다.
특수한 경우 -1
을 사용하면 넘파이가 자동으로 차원을 추정합니다.
c = a.reshape(3, -1) # (3, 2)로 자동 추정
3. 배열의 슬라이싱과 인덱싱
배열의 특정 부분을 추출하거나 수정하기 위해 슬라이싱(Slicing)과 인덱싱(Indexing)이 사용됩니다.
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 1행 2열부터 2행 3까지 추출
subset = arr[1:3, 1:3]
# 불리언 인덱싱: 조건에 맞는 요소 추출
filtered = arr[arr > 5] # 5보다 큰 값만 추출
4. 배열의 결합과 분할
여러 배열을 하나로 합치거나, 하나의 배열을 여러 조각으로 나누는 작업도 중요합니다.
-
결합 (Concatenation):
a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) # 수직 결합 (axis=0) vertical = np.concatenate((a, b), axis=0) # 수평 결합 (axis=1) c = np.array([[5], [6]]) horizontal = np.concatenate((a, c), axis=1)
-
분할 (Splitting):
arr = np.array([1, 2, , 4, 5, 6]) split_arr = np.split(arr, 3) # 3개의 배열로 분할
5. 브로드캐스팅 (Broadcasting)
브로드캐스팅은 서로 다른 크기의 배열 간에 산술 연산을 수행할 수 있도록 해주는 넘파이의 강력한 기능입니다. 작은 배열이 자동으로 큰 배열의 형태에 맞게 확장됩니다.
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([10, 20, 30])
result = a + b # 각 행에 b가 더해짐
이 기능은 반복문 없이도 효율적인 벡터 연산을 가능하게 합니다.
실무에서의 활용 사례
데이터 전처리
- 이미지 데이터에서 픽셀 배열을 정규화하거나 리사이징할 때 배열 조작이 사용됩니다.
- 텍스트 데이터를 임베딩 벡터로 변환 후, 배치 단위로 배열을 재구성합니다.
기계학습 입력 준비
- 입력 데이터를
(샘플 수, 특성 수)
형태의 2D 배열로 변환. - 시계열 데이터의 경우
(배치 크기, 시간 스텝, 특성 수)
형태의 3D 배열로 조작.
메모리 최적화
- 불필요한 복사본 생성을 피하고 뷰(view)를 활용하여 메모리 효율성을 높입니다.
view = arr[::2, ::2] # 슬라이싱은 새로운 배열이 아닌 기존 배열의 참조
주의사항과 성능 팁
- 복사 vs 참조: 슬라이싱은 일반적으로 참조를 반환하므로 원본 배열이 변경되면 슬라이스도 영향을 받을 수 있습니다. 독립적인 복사본이 필요하면
.copy()
를 사용하세요. - 차원 수 확인:
ndim
,shape
속성을 활용해 배열의 구조를 항상 확인하세요. - 벡터화 연산 사용: 반복문 대신 배열 전체에 대한 연산을 사용하면 성능이 크게 향상됩니다.
참고 자료 및 관련 문서
- NumPy 공식 문서
- "Python for Data Analysis" by Wes McKinney
- 관련 위키 항목:
- 데이터 전처리
- 벡터화 연산
- 행렬 연산
배열 조작은 데이터과학의 기초이자 핵심 기술로, 숙련된 데이터 분석가라면 반드시 익혀야 할 능력입니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.