另一种方法是Balltree。它可以query 最接近的K 点。我先生成10K个随机点,整数。
import numpy as np
from sklearn.neighbors import BallTree
points = np.floor(np.random.normal(size=(10000,2), loc=(25,25), scale=(16,16)))
K = 12
创建一棵树,并查询它以找到最接近 K 的点,到 (0,0)。
tree = BallTree(points, leaf_size=10, metric='euclidean')
distances, indici = tree.query( np.array([[0,0]]), k=K,return_distance=True)
创建一个(distance, point) 元组,以便以后可以随意排序。
close_points_as_list = [ (x,y) for (x,y) in points[indici].tolist()[0] ]
distances_as_list = distances.tolist()[0]
distances_points_tuples = list(zip(distances_as_list, close_points_as_list))
对于列表中的p,distances_points_tuples,p[0] 是到(0,0) 的距离,p[1][0] 是 x,p[1][1] 是 y。
我不确定“最小”x 是什么。注意我使用 x 的np.abs() 来定义第二级排序。
sorted_points = sorted(distances_points_tuples, key=lambda x: (x[0], np.abs(x[1][0])) )
import pprint
pprint.pprint(sorted_points)
会给
[(0.0, (0.0, 0.0)),
(1.4142135623730951, (1.0, -1.0)),
(1.4142135623730951, (-1.0, -1.0)),
(1.4142135623730951, (-1.0, 1.0)),
(1.4142135623730951, (-1.0, 1.0)),
(2.0, (0.0, -2.0)),
(2.0, (0.0, 2.0)),
(2.23606797749979, (-1.0, -2.0)),
(2.23606797749979, (2.0, 1.0)),
(2.23606797749979, (-2.0, 1.0)),
(2.23606797749979, (-2.0, -1.0)),
(2.23606797749979, (-2.0, 1.0))]