파이썬

Fancy indexing과 응용

이불속곰팡이 2023. 3. 12. 22:58

Fancy indexing은 배열의 index로 index 값을 나타내는 배열을 넣어서 사용할 수 있는 numpy의 기능이다.

import numpy as np

#ndarray나 파이썬의 기본 리스트 둘 다 입력으로 넣을 수 있다.
boolean_index = np.array([True, False, False, True])
index_arr = [0,2,2,3]

target_arr = np.array([0,1,2,3])

#boolean index 사용. result = [0,3]
target_arr[boolean_index]

#index array 사용. result = [0,2,2,3]
target_arr[index_arr]

단, Fancy indexing으로 나온 배열은 기존 배열의 주소를 가리키는 것이 아닌 새로운 배열로 만들어서 반환한다는 점에 유의하자.

import numpy as np

original = np.array([1,2,3,4])
fancy_arr = original[[2,3]]

#fancy_arr의 index 1의 값을 바꾸더라도 original의 값은 바뀌지 않는다.
fancy_arr[1] = 0
print(original) #[1,2,3,4]

 

이를 잘 활용하면 여러가지 기능을 쉽게 구현할 수 있다.

 

1. ndarray에서 특정 값만 뽑아내기

import numpy as np

target = np.array([-1,2,3,2,-5,0,3])
#배열의 순서를 유지하며 자연수만 뽑아내기 [2,3,2,3]
result = target[target>0]

2. 비디오 데이터에서 일정 비율로 샘플링하기

import numpy as np

#video데이터가 20프레임이 있다고 가정하자
video = np.arange(20)
#3프레임만 추출 [0,6,13]
sample_idx = np.array([int(len(video) / 3 * i) for i in range(3)])
sampling_video = video[sample_idx]

#40프레임 추출 [0,0,1,1,2,2,....]
sample_idx = np.array([int(len(video) / 40 * i) for i in range(40)])
sampling_video = video[sample_idx]