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

时间:2016-04-13 21:04:40

标签: python arrays indices

使用Python 2.7,我有一个值数组,从~0000到~360.000多次。我试图返回所有数组索引的值最接近147.010(甚至重复值),所以我可以稍后使用这些索引。例如,来自一个数组的较小样本是:

kafka-> core -> src.main.scala.kafka - > kafka.scala

我正在寻找最接近147.01的索引的数组或列表,在这种情况下将是:

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])

我试过这个:

1, 4, 7, 10

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

3 个答案:

答案 0 :(得分:3)

如果您按照元素远离枢轴的顺序对数组进行排序,那么您将能够获取前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]

答案 1 :(得分:0)

您可以查看与最近值对应的键。然后将与这些键对应的值附加到列表中。

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])

答案 2 :(得分:0)

如果您喜欢单行,请选择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。这不是你的意思吗?