개요
2022.11.11 - [Python] NumPy - 배열 1에 이어 이번 글에서는 배열의 인덱싱과 슬라이싱에 대해 정리한다.
인덱싱
1차원 배열의 인덱싱은 리스트의 인덱싱과 동일하다.
a = np.array(range(0, 9))
a[2]
실행 결과
2
다차원 배열인 경우에는 쉼표를 이용하여 접근할 수 있다. 쉼표로 구분된 차원은 축(axis)이라고 한다.
b= np.array([[10, 20, 30, 40], [50, 60, 70, 80]])
b
# 2행 3열
b[1, 2]
실행 결과
array([[10, 20, 30, 40],
[50, 60, 70, 80]])
70
슬라이싱
다차원 배열을 슬라이싱할 때는 쉼표와 일반적인 Python 슬라이싱을 함께 사용한다.
b = np.array([[10, 20, 30, 40], [50, 60, 70, 80]])
# 1행 전체
b[0, :]
# 2열 전체
b[:, 1]
실행 결과
array([10, 20, 30, 40])
array([20, 60])
팬시 인덱싱
넘파이 배열은 대괄호에 위치 정보를 나타내는 다른 ndarray 배열을 인덱스 정보로 받을 수 있다. 일종의 데이터베이스 쿼리 기능을 수행할 수 있으며, 이를 팬시 인덱싱, 배열 인덱싱이라고 부른다. 인덱싱 방식에는 boolean 배열 인덱싱과 정수 배열 인덱싱이 있다.
boolean 배열 인덱싱
인덱스 배열의 원소가 True, False로만 존재하며 배열의 크기가 기존 ndarray 객체의 크기와 동일해야 한다.
예로 들어 0부터 9까지의 데이터가 저장된 배열에서 짝수인 원소만 골라내려면 아래와 같은 방식으로 찾을 수 있다.
a = np.array(range(0, 10))
idx = np.array([True, False, True, False, True, False, True, False, True, False])
a[idx]
실행 결과
array([0, 2, 4, 6, 8])
다만 직접 boolean 배열을 선언하는 것보다 조건문 연산을 하는 것이 더 바람직하다.
a = np.array(range(0, 10))
idx = a % 2 == 0
print(idx)
print(a[idx])
print(a[a % 2 == 0])
실행 결과
[ True False True False True False True False True False]
[0 2 4 6 8]
[0 2 4 6 8]
정수 배열 인덱싱
인덱스 배열 내 원소가 기존 ndarray 객체의 원소를 가리켜야 하며, 배열의 크기는 기존 배열의 크기와 같지 않아도 된다.
a = np.array([11, 22, 33, 44, 55, 66, 77, 88, 99])
idx = np.array([0, 2, 4, 6, 8])
a[idx]
실행 결과
array([11, 33, 55, 77, 99])
배열 인덱싱은 다차원 배열에 대해서도 적용할 수 있다.
참고 문서