找到python中两个列表之间最近的最近邻居的索引

时间:2016-01-21 01:14:49

标签: python arrays numpy

给出2个不等大小的numpy数组:A(预先排序的数据集)和B(查询值列表)。我想找到最近的"更低的"数组A中的邻居到数组B的每个元素。下面的示例代码:

import numpy as np

A = np.array([0.456, 2.0, 2.948, 3.0, 7.0, 12.132]) #pre-sorted dataset
B = np.array([1.1, 1.9, 2.1, 5.0, 7.0]) #query values, not necessarily sorted
print A.searchsorted(B)
# RESULT:  [1 1 2 4 4]
# DESIRED: [0 0 1 3 4]

在这个例子中,B [0]的最近邻居是A [0]和A [1]。它最接近A [1],这就是为什么searchsorted将索引1作为匹配返回,但我想要的是索引0处的低邻居.B [1:4]相同,B [4]应匹配A [4]因为两个值都相同。

我可以做一些像这样笨重的事情:

desired = []
for b in B:
    id = -1
    for a in A:
        if a > b:
            if id == -1:
                desired.append(0)
            else:
                desired.append(id)
            break

        id+=1

print desired
# RESULT: [0, 0, 1, 3, 4]

但是,用numpy写这个是更漂亮更简洁的方法。我想让我的解决方案保持笨拙,因为我处理的是大型数据集,但我对其他选项持开放态度。

2 个答案:

答案 0 :(得分:3)

您可以引入可选参数side并将其设置为'right',如docs中所述。然后,将1的最终索引结果减去所需的输出,如此 -

A.searchsorted(B,side='right')-1

示例运行 -

In [63]: A
Out[63]: array([  0.456,   2.   ,   2.948,   3.   ,   7.   ,  12.132])

In [64]: B
Out[64]: array([ 1.1,  1.9,  2.1,  5. ,  7. ])

In [65]: A.searchsorted(B,side='right')-1
Out[65]: array([0, 0, 1, 3, 4])

In [66]: A.searchsorted(A,side='right')-1 # With itself
Out[66]: array([0, 1, 2, 3, 4, 5])

答案 1 :(得分:1)

这是实现此目的的一种方法。 np.argmax在遇到的第一个True处停止,因此只要A被排序,就会提供所需的结果。

[np.argmax(A>b)-1 for b in B]

编辑:我最初得到的不平等错误,现在有效。