NumPy 인덱싱과 슬라이싱
NumPy 인덱싱과 슬라이싱
NumPy 배열의 요소를 읽거나 수정할 때는 인덱싱과 슬라이싱을 써요. 파이썬 리스트와 비슷하지만, 다차원 배열은 쉼표로 축을 구분한다는 점이 다르고, 내부적으로는 뷰(view)를 반환하는 특성이 중요해요.
기본 인덱싱
대괄호 안에 축별 인덱스를 쉼표로 나열해 접근해요.
import numpy as np
a = np.arange(12).reshape(3, 4)
# a = [[0 1 2 3]
# [4 5 6 7]
# [8 9 10 11]]
print(a[1, 2]) # 6 (1행 2열)
print(a[0]) # 첫 행 [0 1 2 3]
슬라이싱
start:stop:step 문법으로 부분 배열을 잘라내요. 이때 반환되는 것은 복사본이 아니라 원본을 참조하는 뷰예요. 그래서 뷰를 수정하면 원본 배열도 바뀌어요.
row = a[1, :] # 1행 전체
col = a[:, 2] # 2열 전체
blk = a[0:2, 0:2] # 왼쪽 위 2x2
blk[0, 0] = 99 # 원본 a[0,0]도 함께 바뀜 (뷰)
원본을 바꾸지 않으려면 .copy()로 복사해서 써야 해요.
불리언 마스크 인덱싱
조건을 만족하는 요소만 뽑는 불리언 마스크 인덱싱은 데이터 분석에서 아주 자주 쓰여요.
a = np.array([1, 2, 3, 4, 5])
mask = a > 3
print(a[mask]) # [4 5]
print(a[a % 2 == 0]) # [2 4] 짝수만
팬시 인덱싱
정수 배열로 특정 위치의 요소들을 뽑을 수도 있어요. 이 경우 결과는 복사본이에요.
idx = np.array([0, 2, 4])
print(a[idx]) # [1 3 5]