복붙노트

[PYTHON] Python에서 가장 가까운 값을 찾고 배열의 인덱스를 반환합니다.

PYTHON

Python에서 가장 가까운 값을 찾고 배열의 인덱스를 반환합니다.

나는이 글을 발견했다 : 파이썬 : 배열에서 원소를 찾는 것

값을 일치시켜 배열의 인덱스를 반환하는 방법입니다.

반면에 내가하고있는 일은 비슷하지만 다르다. 나는 목표 값에 가장 가까운 값을 찾고 싶다. 예를 들어 4.2를 찾고 있지만 배열에 4.2가 없다는 것을 알고 있지만 4.4 대신 4.1 값의 인덱스를 반환하고 싶습니다.

가장 빠른 방법은 무엇입니까?

나는 인덱스에서 목표 값을 빼고 절대 값을 얻고 싶을 때 배열 A를 사용하는 Matlab에서 어떻게 사용했는지와 같은 오래된 방법을 생각하고있다. 그리고 나서 min을 선택한다. 이 같은:-

[~,idx] = min(abs(A - target))

그것이 Matlab 코드입니다. 그러나 파이썬에서 초보자입니다. 그래서 생각하고 있습니다. 파이썬에서 그것을하는 빠른 방법이 있습니까?

도와 주셔서 정말 감사합니다!

해결법

  1. ==============================

    1.bisect_left를 사용하는 것과 비슷하지만 대상 배열을 전달할 수 있습니다.

    bisect_left를 사용하는 것과 비슷하지만 대상 배열을 전달할 수 있습니다.

    def find_closest(A, target):
        #A must be sorted
        idx = A.searchsorted(target)
        idx = np.clip(idx, 1, len(A)-1)
        left = A[idx-1]
        right = A[idx]
        idx -= target - left < right - target
        return idx
    

    몇 가지 설명 :

    첫 번째 일반적인 경우 : idx = A.searchsorted (target)는 대상이 A [index - 1]과 A [index] 사이에 있도록 각 대상에 대한 인덱스를 반환합니다. 왼쪽과 오른쪽을 호출하여 왼쪽

    이제 target이 A의 모든 원소보다 작을 때, idx = 0. idx = np.clip (idx, 1, len (A) -1)은 idx <1의 모든 값을 1로 대체하므로 idx = 1. 이 경우 left = A [0], right = A [1]이고 target <= left <= right임을 알 수 있습니다. 따라서 target = left == right 및 idx-True = 0이 아닌 한 target - left <= 0 및 right - target> = 0이므로 target - left

    target이 A의 모든 요소보다 큰 경우 또 다른 특별한 경우가 있습니다.이 경우 idx = A.searchsorted (target) 및 np.clip (idx, 1, len (A) -1)  idx = len (A) -1이고 target-left

    예 :

    In [163]: A = np.arange(0, 20.)
    
    In [164]: target = np.array([-2, 100., 2., 2.4, 2.5, 2.6])
    
    In [165]: find_closest(A, target)
    Out[165]: array([ 0, 19,  2,  2,  3,  3])
    
  2. ==============================

    2.해당 Numpy 코드는 numpy.argmin을 사용하여 최소 인덱스를 찾는 점을 제외하면 거의 동일합니다.

    해당 Numpy 코드는 numpy.argmin을 사용하여 최소 인덱스를 찾는 점을 제외하면 거의 동일합니다.

    idx = numpy.argmin(numpy.abs(A - target))
    
  3. ==============================

    3.음, 2 년이 넘었고 실제로이 URL에서 매우 간단한 구현을 발견했습니다. numpy 배열에서 가장 가까운 값 찾기

    음, 2 년이 넘었고 실제로이 URL에서 매우 간단한 구현을 발견했습니다. numpy 배열에서 가장 가까운 값 찾기

    구현은 다음과 같습니다.

    def getnearpos(array,value):
        idx = (np.abs(array-value)).argmin()
        return idx   
    

    건배!!

  4. ==============================

    4.테스트를 거친 두 가지 솔루션 :

    테스트를 거친 두 가지 솔루션 :

    idx = np.searchsorted(sw, sCut)
    

    idx = np.argmin(np.abs(sw - sCut))
    

    값 비싼 방법으로 계산하기. 타이밍은 두 번째 솔루션에서 113s, 첫 번째 솔루션에서 132s입니다.

  5. ==============================

    5.가능한 해결책:

    가능한 해결책:

    >>> a = [1.0, 3.2, -2.5, -3.1]
    >>> i = -1.5
    >>> diff = [(abs(i - x),idx) for (idx,x) in enumerate(a)]
    >>> diff
    [(2.5, 0), (4.7, 1), (1.0, 2), (1.6, 3)]
    >>> diff.sort()
    >>> diff
    [(1.0, 2), (1.6, 3), (2.5, 0), (4.7, 1)]
    

    diff [0] [1]에서 가장 가까운 값의 인덱스를 갖게됩니다.

  6. ==============================

    6.

    def finder(myList, target)
        diff = ''
        index = None
        for i,num in enumerate(myList):
            if abs(target - num) < diff:
                diff = abs(target - num)
                index = i
        return index
    

    희망이 도움이

    편집하다:

    1 개의 라이너를 원하면 다음과 같이 좋습니다.

    min(L, key=lambda x: abs(target-x))
    
  7. from https://stackoverflow.com/questions/8914491/finding-the-nearest-value-and-return-the-index-of-array-in-python by cc-by-sa and MIT license