我有一个已排序的浮点数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是一样的。
你最容易做到的是什么?
答案 0 :(得分:5)
我会在Python 2.x中使用zip
(itertools.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"
我认为这可以让你理解这一点,然后能够为你选择最简单的方法。