728x90

 

팬시 색인( fancy indexing)이란?


정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어이다. 팬시 색인은 슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사한다. 값을 가져오는 것이 아닌 값을 복사하는 것이다.

 

팬시 색인 예시


특정한 순서로 행을 선택하고 싶다면 원하는 순서가 명시된 정수가 담긴 ndarray 또는 list를 매개변수로 입력한다.

 

1차원 배열로 팬시색인을 하는 경우

>>> import numpy as np
>>> arr = np.zeros((8,4))
>>> for i in range(8):
... arr[i] = i
>>> arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

>>> arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])

 

2차원 배열로 팬시색인을 하는 경우

각 색인 튜플에 대응하는 1차원 배열이 선택된다.

>>> arr = np.arange(32).reshape((8,4))
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> arr[[1, 5, 7, 2],[0, 3, 1, 2]]
array([ 4, 23, 29, 10])

# (1,0), (5,3), (7,1), (2,2) 위치의 원소들이 선택됨

 

행렬의 행과 열에 대응하는 사각형 모양의 값으로 선택하는 방법

1. 해당하는 배열 추출

2. 추출된 배열 순서 변경

>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
       
>>> arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

 

팬시 색인으로 값을 대입하는 경우, 색인된 값이 변경

>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> arr[[1,5,7,2],[0,3,1,2]] = 0

>>> arr
array([[ 0,  1,  2,  3],
       [ 0,  5,  6,  7],
       [ 8,  9,  0, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22,  0],
       [24, 25, 26, 27],
       [28,  0, 30, 31]])
728x90