给出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写这个是更漂亮更简洁的方法。我想让我的解决方案保持笨拙,因为我处理的是大型数据集,但我对其他选项持开放态度。
答案 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]
编辑:我最初得到的不平等错误,现在有效。