【发布时间】:2013-09-16 18:56:36
【问题描述】:
我有两个嵌套列表 A 和 B:
A = [[50,140],[51,180],[54,500],......]
B = [[50.1, 170], [51,200],[55,510].....]
每个内部列表中的第一个元素从 0 到大约 1e5,第 0 个元素从大约 50 到大约 700,这些元素是未排序的。我想要做的是遍历 A[n][1] 中的每个元素并在 B[n][1] 中找到最近的元素,但是在搜索最近的邻居时,我只想在定义的区间内搜索A[n][0] 正负 0.5。
我一直在使用该功能:
def find_nearest_vector(array, value):
idx = np.array([np.linalg.norm(x+y) for (x,y) in array-value]).argmin()
return array[idx]
例如,在坐标A[0][:]和B[0][:]之间找到最近的邻居。但是,我需要将搜索范围限制在一个围绕值 A[0][0] 的一些小偏移的矩形内。另外,我不想重用元素 - 我想要在区间 A[n][0] +/- 0.5 内的每个值 A[n][1] 到 B[n][1] 之间的唯一双射。
我一直在尝试使用 Scipy 的 KDTree,但这会重用元素,我不知道如何限制搜索范围。实际上,我想沿特定轴在二维嵌套列表上进行一维 NNN 搜索,其中 NNN 搜索的邻域位于由每个内部列表中的第 0 个元素定义的超矩形内,加上或减去一些小偏移.
【问题讨论】:
-
让我们看看我是否明白了你的问题:你希望
find_nearest_vector()函数被限制在某个区间(2D 区间?)。为什么不直接使用[np.linalg.norm(x+y) if array[0][0]-0.5<np.linalg.norm(x+y)<array[0][0]+0.5 else 999999 for (x,y) in array-value] -
(也许我有一些语法问题,但我希望我能传达我的想法)
-
不完全是,每个窗口都是由内部列表中的第 0 个元素定义的。因此,对于每次迭代,定义一个大约 A[n][0] +/- 0.5 的窗口,然后将元素 A[n][1] 匹配到 B[n] 中最近的元素。我希望这更有意义..?
标签: python algorithm numpy scipy nearest-neighbor