我有一个列表,举个例子
[(35.9879845760485, -4.74093235801354), (35.9888687992442, -4.72708076713794),
(35.9889733432982, -4.72758983150694), (35.9915751019521, -4.72772881198689),
(35.9935223025608, -4.72814213543564), (35.9941433944962, -4.72867416528065),
(35.9946670576458, -4.72915181755908), (35.995946587966, -4.73005565674077),
(35.9961479762973, -4.7306870912609), (35.9963563641681, -4.7313535758683),
(35.9968685892892, -4.73182757975504), (35.9976738530666, -4.73194429867996) ]
Run Code Online (Sandbox Code Playgroud)
和 coord = (35.9945570576458, -4.73110757975504)
我想选择衣橱配对coord从list
写一个距离函数并使用min带有关键参数的内置函数.
>>> from functools import partial
>>> dist=lambda s,d: (s[0]-d[0])**2+(s[1]-d[1])**2 #a little function which calculates the distance between two coordinates
>>> a=[(35.9879845760485, -4.74093235801354), (35.9888687992442, -4.72708076713794), ..... ]
>>> coord = (35.9945570576458, -4.73110757975504)
>>> min(a, key=partial(dist, coord)) #find the min value using the distance function with coord parameter
(35.9961479762973, -4.7306870912609)
Run Code Online (Sandbox Code Playgroud)
您还可以使用scipy cKDTree允许您在阵列上执行最近邻搜索的a.当点列表很长时,这应该比穷举搜索更好:
import numpy
from scipy.spatial import cKDTree
data = numpy.array([(35.9879845760485, -4.74093235801354), (35.9888687992442,
-4.72708076713794), (35.9889733432982, -4.72758983150694), (35.9915751019521,
-4.72772881198689), (35.9935223025608, -4.72814213543564), (35.9941433944962,
-4.72867416528065), (35.9946670576458, -4.72915181755908), (35.995946587966,
-4.73005565674077), (35.9961479762973, -4.7306870912609), (35.9963563641681,
-4.7313535758683), (35.9968685892892, -4.73182757975504), (35.9976738530666,
-4.73194429867996) ])
tree = cKDTree(data)
dists, indexes = tree.query(numpy.array([35.9945570576458, -4.73110757975504]), k=3)
for dist, index in zip(dists, indexes):
print 'distance %f: %s' % (dist, data[index])
Run Code Online (Sandbox Code Playgroud)
输出:
distance 0.001646: [ 35.99614798 -4.73068709]
distance 0.001743: [ 35.99594659 -4.73005566]
distance 0.001816: [ 35.99635636 -4.73135358]
Run Code Online (Sandbox Code Playgroud)