NumPy 슬라이싱 및 배열의 복사와 뷰
안녕하세요! "소프트웨어 공장"에 오신 것을 환영합니다. 오늘은 Python의 강력한 라이브러리인 NumPy에서 배열의 슬라이싱(slicing)과 복사(copy), 그리고 뷰(view)에 대해 자세히 알아보겠습니다. 이 주제는 NumPy를 효율적으로 활용하기 위해 반드시 알아야 하는 핵심 개념입니다. 다양한 예제와 함께 설명하니 끝까지 읽어주세요!
1. NumPy 배열의 슬라이싱
NumPy 배열에서 슬라이싱은 특정 부분을 선택하는 데 사용됩니다. 슬라이싱 구문은 Python 리스트의 슬라이싱과 비슷하지만, 다차원 배열에서도 간단하고 강력하게 사용할 수 있다는 점에서 차별화됩니다.
기본 구문
array[start:stop:step]
start
: 시작 인덱스 (포함)stop
: 종료 인덱스 (포함하지 않음)step
: 단계 크기 (기본값은 1)
1차원 배열 슬라이싱 예제
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print("원본 배열:", arr)
# 슬라이싱 예제
print("인덱스 2부터 5까지:", arr[2:6])
print("처음부터 5까지:", arr[:6])
print("2부터 끝까지:", arr[2:])
print("모든 요소를 2단계로:", arr[::2])
다차원 배열 슬라이싱 예제
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("원본 배열:\n", matrix)
# 슬라이싱 예제
print("첫 두 행:", matrix[:2, :])
print("첫 두 열:", matrix[:, :2])
print("중앙 값:", matrix[1:2, 1:2])
2. NumPy 배열의 복사와 뷰
NumPy 배열을 조작할 때, 데이터가 실제로 복사되는지 아니면 원본 데이터를 참조하는지 이해하는 것이 중요합니다.
배열의 뷰 (View)
뷰는 원본 배열의 데이터를 공유합니다. 따라서 뷰를 수정하면 원본 배열에도 영향을 미칩니다.
뷰 생성 예제
arr = np.array([10, 20, 30, 40, 50])
view = arr[1:4]
print("원본 배열:", arr)
print("뷰:", view)
# 뷰 수정
view[0] = 99
print("뷰 수정 후 원본 배열:", arr)
위 예제에서, view
를 수정하면 원본 배열 arr
에도 변경 사항이 반영됩니다.
배열의 복사 (Copy)
복사는 원본 배열과 독립적인 새로운 배열을 생성합니다. 따라서 복사본을 수정해도 원본 배열에는 영향을 미치지 않습니다.
복사 생성 예제
copy = arr.copy()
print("원본 배열:", arr)
print("복사본:", copy)
# 복사본 수정
copy[0] = 100
print("복사본 수정 후 원본 배열:", arr)
print("복사본 수정 후 복사본:", copy)
3. 뷰와 복사의 차이점 요약
특징 | 뷰(View) | 복사(Copy) |
---|---|---|
데이터 공유 여부 | 원본 배열과 데이터 공유 | 원본 배열과 데이터 독립 |
메모리 사용 | 메모리를 추가로 사용하지 않음 | 메모리를 추가로 사용 |
성능 | 더 빠름 | 더 느림 |
원본에 영향 | 영향을 미침 | 영향을 미치지 않음 |
4. 슬라이싱, 뷰, 복사 활용 사례
큰 배열 처리에서 뷰 활용하기
큰 배열을 처리할 때 메모리를 효율적으로 사용하려면 뷰를 사용하는 것이 좋습니다. 예를 들어, 데이터 분석에서 특정 컬럼만 참조해야 하는 경우 뷰를 활용하면 성능이 크게 향상됩니다.
data = np.random.rand(1000, 1000)
column_view = data[:, 0] # 첫 번째 열에 대한 뷰 생성
원본 데이터 보호를 위한 복사 사용하기
데이터를 조작해야 하지만 원본 데이터를 보호해야 한다면 복사를 사용하는 것이 적합합니다.
secure_copy = data.copy()
secure_copy[:, 0] = 0 # 첫 번째 열 데이터를 0으로 변경
결론
오늘은 NumPy 배열의 슬라이싱, 복사, 뷰에 대해 알아보았습니다. 이 주제는 데이터를 효율적으로 관리하고 조작하는 데 매우 중요하며, 성능 최적화와 코드 안정성에 큰 영향을 미칩니다. 실제로 코드를 작성하고 실행하며 개념을 확실히 이해해 보세요.
'Python > NumPy' 카테고리의 다른 글
NumPy Array 기본 산술 연산 (0) | 2025.09.30 |
---|---|
NumPy 배열의 인덱싱 이해하기 (0) | 2025.09.28 |
NumPy 배열의 데이터 타입 이해하기 (0) | 2025.09.27 |
NumPy 배열의 속성 확인하기 (0) | 2025.09.26 |
NumPy 배열 생성 방법 (0) | 2025.09.25 |