np.array 원소를 index에 따라서 가져오고 싶은 경우가 많이 있다. 이때 사용할 수 있는 방법들을 정리하고자 한다.
0. Index를 사용하는 경우
np.array에서 index만 뽑아오는 경우는 대표적으로 np.where, np.argsort, np.min, np.max
등이 있다.
a = np.array([4, 3, 7, 9, 6, 8])
np.argsort(a)
>>>> array([1, 0, 4, 2, 5, 3])
np.where(a>4)
>>>> (array([2, 3, 4, 5]),)
1. np.take
원문에 보면 아래와 같이 설명되어 있다.
Take elements from an array along an axis.
When axis is not None, this function does the same thing as “fancy” indexing (indexing arrays using arrays);
axis가 주어지면 주어지는대로, 안주어지면 안주어지는대로 indices로 array 원소를 골라 반환한다. 이때 입력 array, indices 모두 np.array가 아니어도 되며, 이 부분이 np.take_along_axis
와의 큰 차이점이다.
a = [4, 3, 5, 7, 6, 8]
indices = [0, 1, 4]
np.take(a, indices)
>>>> [4 3 6]
# indices, array 차원이 다르면 broadcast됨
np.take(a, [[0, 1], [2, 3]])
>>>> [[4 3]
[5 7]]
2. np.take_along_axis
원문에 보면 아래와 같이 설명되어 있다.
Take values from the input array by matching 1d index and data slices.
This iterates over matching 1d slices oriented along the specified axis in the index and data arrays, and uses the former to look up values in the latter. These slices can be different lengths.
Functions returning an index along an axis, like argsort and argpartition, produce suitable indices for this function.
index와 관련된 연속된 작업을 할때 np.take_along_axis
를 사용하라고 강력히 적어놨다. 하나의 tensor를 다룰 때는 이를 쓰도록 하자.
a = np.array([[10, 30, 20], [60, 40, 50]])
# argsort 예시
ai = np.argsort(a, axis=1)
ai
>>>> array([[0, 2, 1],
[1, 2, 0]])
np.take_along_axis(a, ai, axis=1)
>>>> array([[10, 20, 30],
[40, 50, 60]])
# max 예시
ai = np.expand_dims(np.argmax(a, axis=1), axis=1)
ai
>>>> array([[1],
[0]])
np.take_along_axis(a, ai, axis=1)
>>>> array([[30],
[60]])
728x90
'python 메모' 카테고리의 다른 글
[pandas] duplicated()의 함정과 모든 중복 데이터 모으기 (0) | 2022.07.31 |
---|---|
[jupyter] notebook 파일 cli로 중단없이 실행시키기 (1) | 2022.07.30 |
[pandas] 셀의 모든 내용 출력하기 (0) | 2022.07.21 |
[예외처리] try, except, finally (0) | 2022.07.18 |
[transformers] tokenizer 결과 (0) | 2022.04.04 |