python:從整數列表(數組)中獲取最接近給定值的數字


---------------------------------2020.12.9更新-----------------------------------

        簡化了 bisect_left

def takeClosest(myList, myNumber):
    if (myNumber >= myList[-1]):
        return myList[-1]
    elif myNumber <= myList[0]:
        return myList[0]
    pos = bisect_left(myList, myNumber)   # 找到 mylist 里面第一個不比 mynumber 小(即 >= )的數的索引下標
    # 返回的插入點 pos 可以將數組myList分成兩部分。左側是 all(val < x for val in myList[lo:i]) ,右側是 all(val >= x for val in myList[i:hi])
    before = myList[pos - 1]
    after = myList[pos]
    if after - myNumber < myNumber - before:
       return after
    else:
       return before

---------------------------------2020.12.9更新-----------------------------------

        突然忘了我為啥要找這個

方法1

a = [1,4,5,7,31,42,112,175,198,465]
b = 35
print(min(a, key=lambda x: abs(x - b)))

        復雜度有點高,但是不要求列表有序,只要有個列表、有個目標值就行

        返回索引

def closest(mylist, Number):
    answer = []
    for i in mylist:
        answer.append(abs(Number-i))
    return answer.index(min(answer))

方法2

from bisect import bisect_left

def takeClosest(myList, myNumber):
    """
     Assumes myList is sorted. Returns closest value to myNumber.
     If two numbers are equally close, return the smallest number.
     If number is outside of min or max return False
    """
    if (myNumber > myList[-1] or myNumber < myList[0]):
        return False
    pos = bisect_left(myList, myNumber)
    if pos == 0:
            return myList[0]
    if pos == len(myList):
            return myList[-1]
    before = myList[pos - 1]
    after = myList[pos]
    if after - myNumber < myNumber - before:
       return after
    else:
       return before

a = [1,4,5,7,31,42,112,175,198,465]
b = 35
answer = takeClosest(a, b)
print(answer)

        時間復雜度比較低,二分方法,但要求列表有序

---------------------------------2020.11.4更新-----------------------------------

方法3

import numpy as np
def find_nearest(array, value):
    array = np.asarray(array)
    idx = (np.abs(array - value)).argmin()
    return array[idx]

array = np.random.random(10)
print(array)
# [0.0443463  0.01646455 0.44072574 0.21144308 0.47655519 0.14408593
#  0.66480614 0.12407934 0.13441338 0.10409808]
value = 0.5
print(find_nearest(array, value))
# 0.47655518571285727

        不要求列表有序,只要有個列表、有個目標值就行,只能處理1 維的

方法4

import numpy as np
def find_nearest(array,value):
    idx = np.searchsorted(array, value, side="left")
    if idx > 0 and (idx == len(array) or abs(value - array[idx-1]) < abs(value - array[idx])):
        return array[idx-1]
    else:
        return array[idx]

a = [1,4,5,7,31,42,112,175,198,465]
b = 185
answer = find_nearest(a, b)
print(answer)

        此方法要求列表數組有序, numpy.searchsorted,也只能處理1 維的,因為 numpy.searchsorted 的接受參數只能是1維的

---------------------------------2020.11.4更新-----------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM