使用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
但是当只需要多个索引时,这只返回一个索引。我看了,但没有找到类似的问题或答案。谢谢你的帮助。
答案 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
。这不是你的意思吗?