优化二维数组中最近点的索引查找

2025-03-14 08:57:00
admin
原创
84
摘要:问题描述:2d NumPy 数组x_array包含 x 方向的位置信息和y_arrayy 方向的位置。然后我有一个 x、y 点列表。对于列表中的每个点,我根据以下代码找到最接近该点的位置的数组索引:import time import numpy def find_index_of_nearest_xy(y...

问题描述:

2d NumPy 数组x_array包含 x 方向的位置信息和y_arrayy 方向的位置。然后我有一个 x、y 点列表。对于列表中的每个点,我根据以下代码找到最接近该点的位置的数组索引:

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

我想加快速度。


解决方案 1:

以下是一个scipy.spatial.KDTree例子

In [1]: from scipy import spatial

In [2]: import numpy as np

In [3]: A = np.random.random((10,2))*100

In [4]: A
Out[4]:
array([[ 68.83402637,  38.07632221],
       [ 76.84704074,  24.9395109 ],
       [ 16.26715795,  98.52763827],
       [ 70.99411985,  67.31740151],
       [ 71.72452181,  24.13516764],
       [ 17.22707611,  20.65425362],
       [ 43.85122458,  21.50624882],
       [ 76.71987125,  44.95031274],
       [ 63.77341073,  78.87417774],
       [  8.45828909,  30.18426696]])

In [5]: pt = [6, 30]  # <-- the point to find

In [6]: A[spatial.KDTree(A).query(pt)[1]] # <-- the nearest point 
Out[6]: array([  8.45828909,  30.18426696])

#how it works!
In [7]: distance,index = spatial.KDTree(A).query(pt)

In [8]: distance # <-- The distances to the nearest neighbors
Out[8]: 2.4651855048258393

In [9]: index # <-- The locations of the neighbors
Out[9]: 9

#then 
In [10]: A[index]
Out[10]: array([  8.45828909,  30.18426696])

解决方案 2:

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

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

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

解决方案 3:

如果您可以将数据调整为正确的格式,那么快速的方法是使用以下方法scipy.spatial.distance

http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

特别是pdist提供cdist计算成对距离的快速方法。

解决方案 4:

搜索方法分为两个阶段:

  1. npt从数据点(你的x y)构建搜索结构,例如 KDTree

  2. 查找nq查询点。

不同的方法有不同的构建时间和不同的查询时间。你的选择很大程度上取决于nptnq

scipy cdist
的构建时间为 0,但查询时间为 ~ npt * nq。KDTree

的构建时间很复杂,查找速度非常快,~ ln npt * nq

在常规(曼哈顿)网格上,你可以做得更好:参见(咳咳)
find-nearest-value-in-numpy-array。

一个小型
测试台::构建一个 5000×5000 个二维点的 KDTree 大约需要 30 秒,然后查询需要几微秒;
在我的旧 iMac 上, scipy cdist
2500 万×20 个点(所有对,4G)大约需要 5 秒。

解决方案 5:

我一直在尝试跟进这一点,但对 Jupyter Notebooks、Python 和这里讨论的各种工具还不熟悉,但我已经设法在路上取得了一些进展。

BURoute = pd.read_csv('C:/Users/andre/BUKP_1m.csv', header=None)
NGEPRoute = pd.read_csv('c:/Users/andre/N1-06.csv', header=None)

我从 BURoute 数据框创建了一个组合 XY 数组

combined_x_y_arrays = BURoute.iloc[:,[0,1]]

我使用以下命令创建点

points = NGEPRoute.iloc[:,[0,1]]

然后我施展 KDTree 魔法

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

results2 = do_kdtree(combined_x_y_arrays, points)

这给了我一个索引数组。我现在想弄清楚如何计算点与结果数组中的索引点之间的距离。

解决方案 6:

def find_nearest_vector(self,arrList, value):
    
    y,x = value
    offset =10
    
    x_Array=[]
    y_Array=[]

    for p in arrList:
        x_Array.append(p[1])
        y_Array.append(p[0])
        

    x_Array=np.array(x_Array)
    y_Array=np.array(y_Array)


    difference_array_x = np.absolute(x_Array-x)
    difference_array_y = np.absolute(y_Array-y)

    index_x = np.where(difference_array_x<offset)[0]
    index_y = np.where(difference_array_y<offset)[0]


    index = np.intersect1d(index_x, index_y, assume_unique=True)

    nearestCootdinate = (arrList[index][0][0],arrList[index][0][1])
    

    return nearestCootdinate
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用