고급 인덱싱
기본 슬라이싱은 연속된 영역에 잘 작동하지만, 때로는 더 복잡한 선택이 필요합니다. NumPy 는 두 가지 강력한 고급 인덱싱 기법을 제공합니다.
정수 배열 인덱싱 (Integer Array Indexing)
인덱스 배열을 제공하여 임의의 요소를 선택합니다. 이는 위치를 사용하여 리스트에서 특정 항목을 선택하는 것과 같습니다.
실제 예시: 시험 점수가 있고 3, 7, 12 번 학생들의 점수를 확인하고 싶다고 가정해 봅시다.
scores = np.array([85, 92, 78, 95, 88, 76, 91, 89, 84, 93, 87, 90, 82])
student_positions = [3, 7, 12] ## 관심 있는 학생들의 위치
selected_scores = scores[student_positions] ## 결과: [95, 89, 82]
불리언 배열 인덱싱 (Boolean Array Indexing, 마스킹)
조건에 따라 요소를 선택합니다. True/False 값으로 "마스크"를 생성한 다음 이를 사용하여 배열을 필터링합니다.
실제 예시: 반에서 합격 점수 (80 점 이상) 를 필터링합니다.
scores = np.array([85, 92, 78, 95, 88, 76, 91, 89, 84, 93])
passing_mask = scores >= 80 ## 결과: [True, True, False, True, True, False, True, True, True, True]
passing_scores = scores[passing_mask] ## 결과: [85, 92, 95, 88, 91, 89, 84, 93]
왜 이것이 중요한가
- 정수 인덱싱: 특정 데이터 포인트를 샘플링하는 데 완벽합니다.
- 불리언 인덱싱: 데이터 필터링 및 조건부 선택에 이상적입니다.
- 둘 다 복사본을 생성하며 (뷰가 아님), 따라서 수정이 원본 배열에 영향을 미치지 않습니다.
둘 다 시도해 보겠습니다. indexing_practice.py 파일의 내용을 다음 코드로 바꾸세요.
import numpy as np
## --- 정수 배열 인덱싱 ---
x = np.arange(10, 0, -1)
print("Array for integer indexing:", x)
## 인덱스 3, 3, 1, 8 의 요소 선택
selected_elements = x[np.array([3, 3, 1, 8])]
print("Selected elements with integer array:", selected_elements)
## --- 불리언 배열 인덱싱 ---
y = np.array([1., -1., -2., 3.])
print("\nArray for boolean indexing:", y)
## 음수 요소에 대한 불리언 마스크 생성
mask = y < 0
print("Boolean mask (y < 0):", mask)
## 조건이 True 인 요소 선택
negative_elements = y[mask]
print("Elements where y < 0:", negative_elements)
파일을 저장하고 스크립트를 실행합니다.
python indexing_practice.py
출력은 정수 및 불리언 인덱싱이 배열에서 특정 데이터를 선택하는 데 어떻게 작동하는지 보여줍니다.
Array for integer indexing: [10 9 8 7 6 5 4 3 2 1]
Selected elements with integer array: [7 7 9 2]
Array for boolean indexing: [ 1. -1. -2. 3.]
Boolean mask (y < 0): [False True True False]
Elements where y < 0: [-1. -2.]