在数组中查找不等于给定点的最近点

Posted

技术标签:

【中文标题】在数组中查找不等于给定点的最近点【英文标题】:Finding nearest point in an array that is not equal to given point 【发布时间】:2021-10-24 20:10:24 【问题描述】:

我有一个点和一个值数组。我希望在数组中找到最近的点 y,使得 x != y。目前我在 Python 中使用标准的 Scipy KDTree 方法,但这不仅仅考虑独特的点。是否有任何解决方法或是否需要手动实施?谢谢!

【问题讨论】:

您可以尝试搜索最近的邻居之外的其他邻居,如果它们与原始邻居的距离不够远而无法唯一。如果重复频繁到足以导致问题,您可以调整 leafsize 参数,因为我假设您不想尽可能使用暴力破解。不过,leafsizek(对于 .query() 方法)的最佳值取决于您的数据。 【参考方案1】:

2D 阵列解决方案: 我回收了大部分与以前相同的方法,但这次它应该适用于您的结构

import math

X = [0,0] # Your cooridinate
x1 = X[0]
y1= X[1]

array = [[1,1],[0,1],[1,0],[-2,2]] # Sample array of data
smallestDistance = 9999 # Make it big so it can be replaced immediately, essentially just a placeholder

for point in array:
    x2 = point[0]
    y2 = point[1]
    separation = math.hypot(x2 - x1, y2 - y1) #Distance equation in easy format
    if separation < smallestDistance and separation!=0:  # Could make this <= instead of < if you want to replace any ties for closest point
        smallestDistance = separation
        closestPoint = point
print(f"Nearest cooridinate = closestPoint, separation from X is: smallestDistance")

一维阵列的旧解决方案: 我不太确定你的数组的结构是什么,但据我所知,你有一个一维数组和一个给定的值;您想要数组中最接近原始值的唯一值。如果这是正确的,那么快速而肮脏的解决方案可能类似于:

smallestDifference = 99999999 #Make this some large number
y = array[someindex]
for thing in array:
     difference = abs(thing-y)
          if difference<smallestDifference & difference != 0:  #Must be closer than the last recorded closest point, AND non-zero i.e. a unique point
               smallestDifference = difference #New smallest distance between points
               closestPoint = thing #Record the new closest point
print(f"x = closestPoint, |y-x| = smallestDifference")

如果这是一个 >1d 数组,可能会有点棘手,而且可能不是最快的解决方案,因为它必须检查每个点.. 但可能会完成工作:-)

【讨论】:

感谢您的回复!我应该在 OP 中指定,我的数据都是 2D 的(它们通过坐标对表示一个位置)。 @CBBAM 哦,好吧!所以它是一个 2d x/y 点的数组,您想在该数组中找到与同一数组中已知点最近的点? 是的,我有一个点 x,它可能在数组中,也可能不在数组中。我想在数组中找到点 y,使其最接近 x 但也不接近 x 本身。 将其作为对此答案的编辑发布 - 如果有任何不妥之处,请告诉我,干杯!

以上是关于在数组中查找不等于给定点的最近点的主要内容,如果未能解决你的问题,请参考以下文章

大厂算法面试:使用移动窗口查找两个不重叠且元素和等于给定值的子数组

一个无序数组,任意两个数相加等于一个给定的数,并且用复杂度最小的方法得出

给定数组和一个常量,从数组中找到两个数之和等于常量,如何做最快

数组名不等于指针---sizeof()函数求数组大小错误问题

LeetCode面试题11. 旋转数组的最小数字

在给定坐标和最大距离的情况下查找到某个点的最近点 - 使用 Mongoose 和 MEAN 堆栈查询结果未定义