查找在Python中列出最接近特定值的项目

时间:2014-05-19 15:25:57

标签: python nearest-neighbor bins

我有一个已排序的浮点数y列表,以及未排序的浮点数x列表。

现在,我需要找出x中每个元素y所在的元素,最好是y的索引。例如,如果

y=[1,2,3,4,5]

x[0]=3.5 

我需要0的索引x的输出为(2,3),因为3.5介于y[2]y[3]之间。< / p>

基本上,我认为它与将y看作bin边缘并将x排序到这些bin是一样的。

你最容易做到的是什么?

3 个答案:

答案 0 :(得分:5)

我会在Python 2.x中使用zipitertools.izip)来完成此任务:

from itertools import islice#, izip as zip # if Python 2.x

def nearest_neighbours(x, lst):
    for l1, l2 in zip(lst, islice(lst, 1, None)):
        if l1 <= x <= l2:
            return l1, l2
    else:
        # ?

使用示例:

>>> nearest_neighbours(3.5, range(1, 6))
(3, 4)

如果x中的任何一对lst之间没有# ?(即替换{{1}},则必须决定您想要发生什么!)如果您想要索引(尽管您的例如,没有使用它们,玩enumerate

答案 1 :(得分:1)

谢谢 - 我知道如何逐步编码。但是,我一直在寻找一个漂亮/简单/优雅的解决方案,现在我正在使用numpy.digitize(),它看起来很漂亮并且效果很好。

答案 2 :(得分:0)

问:你最容易做到的是什么?

我认为你应该看到这个伪代码而不是给你代码,而是尝试编写自己的代码!如果您想自学,请不要只是从互联网上复制粘贴代码!

伪代码:

// Assume that when you have a tie,
// you put the number in the smallest range
// Here, b is between 2.1 and 3.5, instead of
// 3.5 and 4.1
float a[5] = {0.1, 1.1, 2.1, 3.5, 4.1}; // your y
float b = 3.5;                          // your x

// counter for the loop and indexes. Init i to second element
integer i = 1, prev = -1, next;

// while we are not in the end of the array
while(i < 5) {
    // if b is in the range of ( a(i-1), a(i) ]
    if(b <= a[i] && b > a[i - 1]) {
    // mark the indexes
        prev = i - 1;
        next = i;
    }

    // go to next element
    i++;
}

if(prev = -1)
    print "Number is not between some numbers"
else
    print "prev, next"

我认为这可以让你理解这一点,然后能够为你选择最简单的方法。