python - 在列表中查找最接近给定数字的值的位置

标签 python numpy

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

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/

相关文章:

python - 如何根据多列过滤 Pandas 数据集?

python - Matplotlib/python 可点击点

python - 类型错误 : '<=' not supported between instances of 'decimal.Decimal' and 'dict'

python - 查找位于点云凹包中的点

python - 如何使用列的值将 2 个 numpy ndarray 合并到 ndarray 上?

python - 在 python 中“合并”两个对象

python - 如何在 Google 表格和 Mysql 数据库之间同步数据?

python - 向结构化numpy数组添加字段(二)

python - 使用 "..."进行张量索引操作

python - 如何使用 numpy.void 类型