簡體   English   中英

在給定數字的最接近值的列表中查找位置

[英]Finding the position in a list of the closest value to a given number

我有一個值列表,例如,不一定排序

list=[1.1,0.7,1.8,2.,1.65]

我想在列表中找到與給定數字最接近的值的位置,例如a=1.4 列表中的值是大於還是小於給定值無關緊要。 當然,一種方法是使用for循環

import numpy as np
d=100.
i=0
for s in list:
    if np.abs(s-a)<d:
        pos=i
        d=np.abs(s-a)   
    i+=1
print pos  

但在python中必須有一個更好的方法。 我怎樣才能更合成呢? 如果值被排序怎么辦?

您可以將其轉換為numpy數組並計算項目與target之間的最小絕對差異的索引,如:

def min_diff_pos(array_like, target):
    return np.abs(np.array(array_like)-target).argmin()

例如:

>>> min_diff_pos([1.1,0.7,1.8,2.,1.65], 1.1)
0
>>> min_diff_pos([1.1,0.7,1.8,2.,1.65], 1.8)
2
>>> min_diff_pos([1.1,0.7,1.8,2.,1.65], 1.7)
4
>>> min_diff_pos([1.1,0.7,1.8,2.,1.65], 1.79)
2

如果值已排序,我們可以使用二進制搜索算法,然后查看插入點附近的兩個項目。 在這種情況下,它是這兩者中最接近的。 這使得查找O(log n)而不是O(n)

def min_diff_pos_sorted(sorted_array, target):
    idx = np.searchsorted(sorted_array, target)
    idx1 = max(0, idx-1)
    return np.abs(np.array(sorted_array[idx1:idx+1])-target).argmin() + idx1

例如:

>>> data = np.array([0.7, 1.1, 1.65, 1.8, 2.0])
>>> min_diff_pos_sorted(data, 0.7)
0
>>> min_diff_pos_sorted(data, 0.8)
0
>>> min_diff_pos_sorted(data, 0.9)
0
>>> min_diff_pos_sorted(data, 1.0)
1
>>> min_diff_pos_sorted(data, 1.1)
1
>>> min_diff_pos_sorted(data, 1.2)
1
>>> min_diff_pos_sorted(data, 1.3)
1
>>> min_diff_pos_sorted(data, 1.4)
2

一個非常簡單的解決方案,沒有numpy或其他第三方工具:

values = [1.1, 0.7, 1.8, 2., 1.65]

def get_min_pos(values, referencevalue):
    d = [(referencevalue - x)**2 for x in values]
    return d.index(min(d))

第一次測試:

testvalues = values
for value in testvalues:
    expected_pos = values.index(value)
    pos = get_min_pos(values=values, referencevalue=value)
    assert pos == expected_pos

# list of testvalue and expected indox pos for the value
testvalues = [(1.0, 0), (0.8, 1), (0.9, 0), (0.89, 1), ]
for value, expected_pos in testvalues:
    value = get_min_pos(values=values, referencevalue=value)
    assert value == expected_pos

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM