Numpy에서 검색

Oct 01 2020

아래 코드에서 abs (arr)를 수행하면 오름차순 번호를 정렬했으며 부호가 음수에서 양수로 변경된 색인을 검색하려고합니다. 아래 코드를 작성했지만 어떤 이유로 든 개선하거나 더 최적화 할 수 있다고 생각합니다. 팁과 요령이 있습니까?

import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output:   4
arr[_cut_index_2] # output:  -3

답변

4 Juho Oct 03 2020 at 00:45

현재 솔루션은 입력 배열 (의 두 번 호출 np.where)에 대해 두 번의 패스를 수행합니다 . 문제를 해결하는 간단한 방법 중 하나 np.argmax는 선형 시간이 걸리는 방법을 사용 하는 것입니다.

import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3

이 시점에서 (당신이 암시하는 것처럼) 단일 관심 위치가 있다고 가정 할 수 있다면 (그리고 / 또는 첫 번째 위치에만 관심이 있고 왼쪽에서 오른쪽으로 읽음) 우리는 완료된 것입니다. 답과 다른 컷오프 지점이 있습니다 (그러나 유효하지 않은 인덱스를 반환하지 않도록 코너 케이스에 있는지 확인하십시오).

그러나 실제로 입력이 정렬되었다고 안전하게 가정 할 수 있다면 선형 스캔을 피하고 전체 입력을 읽지 않을 수도 있습니다. 이를 위해 searchsorted 를 통해 이진 검색을 수행 할 수 있습니다 . 이론적으로 이것은 더 빠르지 만 (즉, 최악의 경우 로그 대 선형) 실제로 이것은 배열의 크기에 따라 달라집니다. 즉, 충분히 작은 배열의 경우 캐시 지역성으로 인해 선형 스캔이 더 빠릅니다 (또는 적어도 하드웨어 세부 정보를 모듈로하는 경우).