当前位置: 首页 > 面试题库 >

在x和y坐标的numpy数组中查找最近点的索引

吴胜
2023-03-14
问题内容

我有两个2d numpy数组:x_array包含x方向上的位置信息,y_array包含y方向上的位置。

然后,我有一长串x,y点。

对于列表中的每个点,我需要找到最接近该点的位置(在数组中指定)的数组索引。

我已经根据这个问题天真的产生了一些有效的代码:
在numpy数组中找到最接近的值

import time
import numpy

def find_index_of_nearest_xy(y_array, x_array, y_point, x_point):
    distance = (y_array-y_point)**2 + (x_array-x_point)**2
    idy,idx = numpy.where(distance==distance.min())
    return idy[0],idx[0]

def do_all(y_array, x_array, points):
    store = []
    for i in xrange(points.shape[1]):
        store.append(find_index_of_nearest_xy(y_array,x_array,points[0,i],points[1,i]))
    return store


# Create some dummy data
y_array = numpy.random.random(10000).reshape(100,100)
x_array = numpy.random.random(10000).reshape(100,100)

points = numpy.random.random(10000).reshape(2,5000)

# Time how long it takes to run
start = time.time()
results = do_all(y_array, x_array, points)
end = time.time()
print 'Completed in: ',end-start

我正在大型数据集上执行此操作,并且真的想加快速度。谁能优化这个?

谢谢。

更新:根据@silvado和@justin(如下)的建议的解决方案

# Shoe-horn existing data for entry into KDTree routines
combined_x_y_arrays = numpy.dstack([y_array.ravel(),x_array.ravel()])[0]
points_list = list(points.transpose())


def do_kdtree(combined_x_y_arrays,points):
    mytree = scipy.spatial.cKDTree(combined_x_y_arrays)
    dist, indexes = mytree.query(points)
    return indexes

start = time.time()
results2 = do_kdtree(combined_x_y_arrays,points_list)
end = time.time()
print 'Completed in: ',end-start

上面的这段代码使我的代码加速了100倍(在100x100矩阵中搜索5000点)。有趣的是,使用scipy.spatial.KDTree(而不是scipy.spatial.cKDTree)给出了与我朴素的解决方案相当的计时,因此使用cKDTree版本绝对值得…


问题答案:

scipy.spatial也有一个kd树实现:scipy.spatial.KDTree

方法通常是首先使用点数据来构建kd树。其计算复杂度约为N log
N,其中N是数据点的数量。然后可以进行对数N复杂度的范围查询和最近邻居搜索。这比简单地遍历所有点(复杂度N)要有效得多。

因此,如果您重复了范围查询或最近邻查询,则强烈建议使用kd树。



 类似资料:
  • 问题内容: 是否有numpy-thonic方法(例如函数)在数组中查找最接近的值? 例: 问题答案:

  • 本文向大家介绍C ++程序查找数组中最近的点对,包括了C ++程序查找数组中最近的点对的使用技巧和注意事项,需要的朋友参考一下 这是在数组中查找最接近的点对的程序。 演算法 对于最近点之间的距离 要计算最小距离- 示例 输出结果

  • 问题内容: 我希望能够在数字数组中找到最接近的较小值。例如,如果我有: 我正在寻找小于以下值的最接近值: 该函数将返回: 另外,如果我传递的数字大于数组中的最大值,则它应返回最大值。如果我传递的数字小于最小值,则应返回nil。 我尝试使用数组上的函数执行此操作,但是单独执行此操作不会产生我想要的结果,因为我需要这样的东西: 但不幸的是,这是无效的。有什么建议?我知道可以使用while循环轻松完成此

  • 问题内容: 有一条折线,其中折线的顶点列表为[[x1,y1),(x2,y2),(x3,y3),…]和一个点(x,y)。在Shapely中,返回两个几何之间的最短距离。 但是我还需要找到最接近点(x,y)的线上的点的坐标。在上面的示例中,这是距离1.4142135623730951单位的对象上的点的坐标。计算距离时,该方法应具有坐标。有什么方法可以从此方法返回它吗? 问题答案: 您正在描述的GIS术

  • 问题内容: NumPy具有有效的功能/方法来标识对象中非零元素的索引。什么是最有效的方式来获得该元素的索引 做 具有零值? 问题答案: numpy.where()是我的最爱。

  • 问题内容: 我有一个数组: 我希望在此数组中找到多个值的行的索引: 对于此示例,我想要一个类似的结果: 我有一个执行此操作的代码,但我认为它过于复杂: 我找到了类似问题的答案,但仅适用于一维数组。 有没有一种方法可以更简单地完成我想要的工作? 问题答案: 方法1 一种方法是像这样 方法#2 一种内存有效的方法是将每一行转换为等效的线性索引,然后使用np.in1d,例如, 方法3 使用np.sear