我有一个值列表,例如不一定排序
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
关于python - 在列表中查找最接近给定数字的值的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57501578/