在python数组中查找接近给定数字的多个值

在python数组中查找接近给定数字的多个值,python,arrays,indices,Python,Arrays,Indices,使用Python2.7,我有一个从~0.000到~360.000多次的值数组。我试图返回所有数组索引,其值最接近147.010(甚至是重复的值),以便稍后使用这些索引中的每一个。例如,一个阵列中的较小样本为: array([ 146.749, 147.249, 147.749, 146.749, 147.249, 147.749, 146.749, 147.263, 147.749, 146.472, 147.469, 148.471]) 我正在寻找一个最接近147.0

使用Python2.7,我有一个从~0.000到~360.000多次的值数组。我试图返回所有数组索引,其值最接近147.010(甚至是重复的值),以便稍后使用这些索引中的每一个。例如,一个阵列中的较小样本为:

array([  146.749,  147.249,  147.749,  146.749,  147.249,  147.749,  146.749,  147.263,  147.749,  146.472,  147.469,  148.471])
我正在寻找一个最接近147.01的索引数组或列表,在本例中为:

1, 4, 7, 10
我试过这个:

min(范围(len(数组)),key=lambda i:abs(数组[i]-some_值))


但当需要多个索引时,这只返回一个索引。我看了一下,但没有找到类似的问题或答案。感谢您的帮助。

您可以浏览并找到与最接近的值对应的键。然后将这些键对应的值附加到列表中

new_array = map(lambda x: abs(x-some_value),my_array)

min_value=min(new_array)
现在找到新值的索引

my_keys = []
for i,val in enumerate(new_array):
    if val == min_value:
        my_keys.append(i)
最后创建输出列表

my_answer=[]
for i in my_keys:
    my_answer.append(my_array[i])

如果您按照元素远离轴心的顺序对数组进行排序,那么您将能够获取前k个元素,这些元素与您正在查看的元素最接近

def k_closest(sample, pivot, k):
    return sorted(sample, key=lambda i: abs(i - pivot))[:k]
例如:

>>> l = [1,2,3,4]
>>> k_closest(l, 3, 2)
[3,2]
>>> k_closest(l, 3, 3)
[3,2,4]
要同时获取元素的索引,可以执行以下操作:

def k_closest(sample, pivot, k):
    return sorted(enumerate(sample), key=lambda (n, v): abs(v - pivot))[:k]
使用与以前相同的元素运行它,我们得到

>>> l = [1,2,3,4]
>>> k_closest(l, 3, 2)
[(2, 3), (1, 2)]
>>> k_closest(l, 3, 3)
[(2, 3), (1, 2), (3, 4)]
对于列表中的每个元组,第一个元素是原始数组中的索引,第二个元素是您实际感兴趣的数字

如果您只是想要索引,您可以稍微调整函数,使其成为

import operator

def k_closest(sample, pivot, k):
    return map(operator.itemgetter(0), sorted(enumerate(sample), key=lambda (n, v): abs(v - pivot)))[:k]
使用原始输入运行,现在将为您提供

>>> k_closest(l, 3, 2)
[2, 1]
>>> k_closest(l, 3, 3)
[2, 1, 3]

如果您喜欢单行程序,请使用
k=147.01
,然后您可以执行以下操作:

print [i for i, v in enumerate(array) if abs(v - k) == min([abs(x - k) for x in array])]
产出:[1、4]

它将打印与
k
相等的n个元素索引。在您的列表中,索引7、10处的元素不尽相同,您可以再次检查这些数字吗

编辑:让我们使用问题中的数组逐一查看:

[146.749,  147.249,  147.749,  146.749,  147.249,  147.749,  146.749,  147.263,  147.749,  146.472,  147.469,  148.471]
索引处元素的距离:1、4、7、10:

index = 1,  abs(147.249 - 147.01) = 0.239
index = 4,  abs(147.249 - 147.01) = 0.239
index = 7,  abs(147.263 - 147.01) = 0.253
index = 10, abs(147.469 - 147.01) = 0.459

根据这些数字,索引
1,4
处的元素与
147.01
的距离小于
7,10
。这不是你的意思吗?

问题是你试图找到最近的物品,但是多次,那么你想要多少?因为举例来说,如果每次我们找到最接近的,我们都会从列表中删除它,然后我们可以继续,依此类推,但必须设置一个限制,否则最终会得到所有的值…对于重复的,很简单,它是所有值的索引,等于刚刚找到的最接近的值,依此类推。您要查找n个最接近的数字,或间隔[x-d,x+d]内的所有数字?给定一个值数组,从最接近用户给定数字的数组中查找所有值。对于代码找到的所有接近值,返回这些索引。@WXNerd“最近”的字面意思是“最近”还是“在某个公差范围内”?根据您提供的值判断,可能是后者。当我尝试运行此代码时,我在第一行收到一条错误消息。我在我的数组中输入数组的名称,在某个数组值中输入我要查找的数字。我收到消息:“TypeError:map()至少需要两个参数”。我看不出一个论点是如何缺失的。应该被修正。你必须用你的变量替换变量名。从我的数据来看,索引7和索引10中的数字是正确的。用这些元素的逐个比较更新了我的答案。如果遗漏了什么,请随时澄清。。