Numpy Indexing

김명섭·2024년 11월 8일

1. Boolean Indexing

True에 해당하는 원소만 뽑는 인덱싱 방법이다.

arr = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])

mask = arr > 5
print(arr[mask])

2. Fancy Indexing(1차원)

행값과 열값이 묶여있지 않고, 행값끼리 열값끼리 묶여있는 경우에도 길이를 맞춰 인덱싱이 가능하다.

arr = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])

rows = [0,1,2]  # 행 인덱스
cols = [0,2,0]  # 열 인덱스
print(arr[rows,cols])

3. 확장

2의 확장으로 2번 방법은 2차원 배열 arr에 rows와 cols 두 1차원 배열을 통해 인덱싱하였다.
이 때, 2차원 배열에 1차원 배열 하나로 인덱싱을 하면, 다음과 같다.

arr = np.array([[1,2,3],
                [4,5,6],
                [7,8,9]])

print(arr[[0,1,0]])


이렇듯, 1차원 배열을 넣으면 각 원소를 가져오는데, 0 인덱싱은 0행을 의미하고, 1 인덱싱은 1행을 의미하기 때문에 행을 가져오게 되는 것이다.
인덱싱이라는 것이 인덱스를 대상 배열의 값으로 매핑하는 함수라고 생각해보자.
2차원 배열에 2차원 인덱싱을 하면, 익덱스 배열의 각 원소는 대상 배열의 가장 앞 차원의 크기(2차원의 경우 행의 개수)와 같아야 하고, 인덱스 배열의 각 원소와 인덱스에 해당하는 행이 매핑되고 치환되는 구조라고 생각하면 아래의 구조도 이해하기 편하다.

arr = np.array([[1,2,3],
                [4,5,6]])

label = np.array([[0,1], [0,0], [1,1]])

print(arr[label])


아래처럼 label 인덱싱 배열의 각 원소가 arr 대상 배열의 행들과 매핑되어 교체되는 것이라고 생각할 수 있다.
즉, (3,2) 크기의 label이 각 원소가 3차원으로 바뀜으로 인해, (3,2,3) 크기가 되는 것이다.
(당연하게도, label의 값들은 arr의 행들과 매핑돼야 하므로, 값은 0과 1, 2가지만 가능하다.)

profile
ML Engineer

0개의 댓글