2d NumPy数组x_array
包含x方向的位置信息,y_array
在y方向上的位置。我有一个x,y点的列表。对于列表中的每个点,我根据this code找到最接近该点的位置的数组索引:
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
我想加快速度。
6条答案
按热度按时间xam8gpfp1#
下面是一个
scipy.spatial.KDTree
示例pbossiut2#
scipy.spatial
也有k-d树实现:scipy.spatial.KDTree
。该方法通常是首先使用点数据来建立k-d树。其计算复杂度为N log N的数量级,其中N是数据点的数量。范围查询和最近邻搜索可以以log N复杂度完成。这比简单地循环遍历所有点(复杂度N)要有效得多。
因此,如果您有重复的范围或最近邻查询,强烈建议使用k-d树。
pwuypxnk3#
如果你能将数据转换成正确的格式,一个快速的方法是使用
scipy.spatial.distance
中的方法:http://docs.scipy.org/doc/scipy/reference/spatial.distance.html
特别是
pdist
和cdist
提供了计算成对距离的快速方法。qc6wkl3g4#
搜索方法有两个阶段:
1.建立搜索结构,例如一个KDTree,来自
npt
数据点(您的x y
)1.查找
nq
查询点。不同的方法有不同的构建时间和不同的查询时间。您的选择将在很大程度上取决于
npt
和nq
:scipy cdist的构建时间为0,但查询时间约为
npt * nq
。KDTree构建时间很复杂,查找速度非常快,~
ln npt * nq
。在一个常规的(曼哈顿)网格上,你可以做得更好:见(ahem)find-nearest-value-in-numpy-array。
一个小测试台::建立一个5000 × 5000二维点的KDTree大约需要30秒,然后查询需要微秒; scipy cdist 2500万× 20点(所有对,4G)大约需要5秒钟,在我的旧iMac上。
j91ykkif5#
我一直在努力沿着这条路走下去,但我对笔记本电脑、Python和这里讨论的各种工具都是新的,但我已经设法在我旅行的道路上走了一些路。
我从我的BURoute矩阵创建一个组合XY阵列
我用下面的命令创建点
然后,我做KDTree魔术
这给了我一个索引数组。我现在试图弄清楚如何计算结果数组中的点和索引点之间的距离。
bzzcjhmw6#