没有 kd 树的 Python 中的最近邻搜索
我从 C++ 背景开始学习 Python。我正在寻找一种快速而简单的方法来查找多维点的 2D(numpy)数组(也是 numpy 数组)中某些多维查询点的最近(最近邻居)。我知道 scipy 有一个 kd 树,但我认为这不是我想要的。首先,我将更改二维数组中多维点的值。其次,二维数组中每个点的位置(坐标)很重要,因为我还将更改它们的邻居。
我可以编写一个函数来遍历 2D 数组并测量查询点与数组中的点之间的距离,同时跟踪最小的点(使用 scipy 空间距离函数来测量距离)。是否有内置函数可以执行此操作?我试图尽可能避免在 python 中迭代数组。我还将有许多查询点,因此至少有两个“for 循环” - 一个用于迭代查询点,对于每个查询,一个循环用于迭代 2D 数组并找到最小距离。
感谢您的任何建议。
I'm beginning to learn Python coming from a C++ background. What I am looking for is a quick and easy way to find the closest (nearest neighbor) of some multidimensional query point in an 2D (numpy) array of multidimensional points (also numpy arrays). I know that scipy has a k-d tree, but I don't think this is what I want. First of all, I will be changing the values of the multidimensional points in the 2D array. Secondly, the position (coordinates) of each point in the 2D array matters as I will also be changing their neighbors.
I could write a function that goes through the 2D array and measures the distance between the query point and the points in the array while keeping track of the smallest one (using a scipy spatial distance function to measure distance). Is there is a built in function that does this? I am trying to avoid iterating over arrays in python as much as possible. I will also have numerous query points so there would be at least two "for loops" - one to iterate through the query points and for each query, a loop to iterate through the 2D array and find the minimum distance.
Thanks for any advice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果简洁是您的目标,您可以这样做:
如果您有多个查询点:
If concise is your goal, you can do this one-liner:
If you have several query points:
广播对于这种事情非常有用。我不确定这是否是您所需要的,但在这里我使用广播来查找 p(3 空间中的一个点)和 X(3 空间中的一组 10 个点)之间的位移。
Broadcasting is very useful for this kind of thing. I'm not sure if this is what you need, but here I use broadcasting to find the displacement between p (one point in 3 space) and X (a set of 10 points in 3-space).
您可以计算所有距离
scipy.spatial.distance.cdist( X, Y )
或使用 RTree 获取动态数据: http://gispython.org/rtree/docs/class.html< /a> .
You can compute all distances
scipy.spatial.distance.cdist( X, Y )
or use RTree for dynamic data: http://gispython.org/rtree/docs/class.html .
为了更快地搜索和支持动态项目插入,您可以对 2D 项目使用二叉树,其中大于和小于运算符由到参考点 (0,0) 的距离定义。
For faster search and support for dynamic item insertion, you could use a binary tree for 2D items where greater and less than operator is defined by distance to a reference point (0,0).