1 方法介绍
scipy.spatial.KDTree(
data,
leafsize=10,
compact_nodes=True,
copy_data=False,
balanced_tree=True,
boxsize=None)
用于快速最近邻查找的kd树
对于大维数(20已经很大),不要期望这比暴力搜索快很多。高维最近邻查询是计算机科学中一个重大的未解问题。
2 参数
data | 类数组,形状为 (n,m) 要索引的n个m维数据点 |
leafsize | 算法转为暴力搜索的数据点数。默认值为10。 |
compact_nodes | 布尔值,可选【默认值为True】 如果为True,则构建kd树时会缩小超矩形到实际数据范围。 这通常会生成更紧凑的树,它对退化输入数据具有较强的鲁棒性,并且可以在增加构建时间的代价下加速查询。 |
copy_data | 布尔值,可选 如果为True,则数据总是被复制以保护kd树免受数据损坏。 默认值为False。 |
balanced_tree | 布尔值,可选 如果为True,则使用中位数而不是中点来分割超矩形。 这通常会生成更紧凑的树并加速查询,但增加了构建时间。 默认值为True。 |
3 举例
from scipy.spatial import KDTree
coordinates
#假设有这个列表存在
'''
array([[116.30633576, 39.97985419],
[116.32477106, 40.00140643],
[116.32925162, 39.99218811],
...,
[116.33828523, 39.94021838],
[116.31098946, 40.00380335],
[116.34905741, 39.86500981]])
'''
kdtree = KDTree(coordinates)
3 属性
data | 要索引的n个m维数据点 |
leafsize | 算法转为暴力搜索的数据点数 |
m | 单个数据点的维度 |
n | 数据点的数量 |
maxes | n个数据点每个维度的最大值 形状为 (m,) |
mins | n个数据点每个维度的最小值 形状为 (m,) |
size | 树中的节点数 |
4 主要方法
4.1 query
KDTree.query(
x,
k=1,
eps=0,
p=2,
distance_upper_bound=inf,
workers=1)
查询kd树以找到最近的邻居
x | 要查询的点数组 |
k | 返回最近邻居的数量 |
eps | 返回近似最近邻居;返回的第k个值保证不超过到真实第k个最近邻居距离的(1+eps)倍 |
p | 使用哪种闵可夫斯基p范数。 1是绝对值之和距离(“曼哈顿”距离)。 2是常规的欧几里得距离。 无穷大是最大坐标差距离 |
distance_upper_bound | 仅返回在此距离内的邻居 |
workers | 用于并行处理的工作线程数量。 如果给出-1,则使用所有CPU线程。默认值:1 |
distances, indices = kdtree.query(coordinates, k=11)
distances
'''
array([[0. , 0.0021747 , 0.00407019, ..., 0.00590605, 0.00600945,
0.00630101],
[0. , 0.00180668, 0.00237115, ..., 0.00559552, 0.00621217,
0.00663365],
[0. , 0.00250751, 0.00310879, ..., 0.00522053, 0.00541728,
0.00606105],
...,
[0. , 0.0034222 , 0.00344221, ..., 0.00610721, 0.00616627,
0.00771157],
[0. , 0.0010156 , 0.00140355, ..., 0.00474158, 0.00477727,
0.00556775],
[0. , 0.00234204, 0.00589404, ..., 0.01846328, 0.01884219,
0.01942178]])
'''
indices
'''
array([[ 0, 518, 603, ..., 526, 345, 559],
[ 1, 12, 7, ..., 204, 56, 5],
[ 2, 124, 245, ..., 133, 96, 93],
...,
[904, 852, 386, ..., 57, 253, 147],
[905, 380, 10, ..., 154, 117, 739],
[906, 646, 880, ..., 465, 129, 219]], dtype=int64)
'''
4.2 query_ball_point
找到距离点x一定距离r内的所有点
KDTree.query_ball_point(
x,
r,
p=2.0,
eps=0,
workers=1,
return_sorted=None,
return_length=False)
x | 要查询的点数组 |
r | 要返回的点的半径,必须与x的长度广播 |
eps | 近似搜索。 如果树的分支最近的点比 r / (1 + eps) 更远,则不探索这些分支; 如果它们最远的点比 r * (1 + eps) 更近,则批量添加这些分支 |
p | 使用哪种闵可夫斯基p范数。 1是绝对值之和距离(“曼哈顿”距离)。 2是常规的欧几里得距离。 无穷大是最大坐标差距离 |
workers | 用于并行处理的工作线程数量。 如果给出-1,则使用所有CPU线程。默认值:1 |
return_sorted | 如果为True,则对返回的索引进行排序; 如果为False,则不排序 如果为None,不排序单点查询,但对多点查询进行排序 |
return_length | 返回半径内点的数量而不是索引列表 |
4.3 query_pairs
KDTree.query_pairs(
r,
p=2.0,
eps=0,
output_type='set')
找到自身中距离最多为r的所有点对
r | 最大距离 |
p | 使用哪种闵可夫斯基p范数。 1是绝对值之和距离(“曼哈顿”距离)。 2是常规的欧几里得距离。 无穷大是最大坐标差距离 |
eps | 近似搜索。 如果树的分支最近的点比 r / (1 + eps) 更远,则不探索这些分支; 如果它们最远的点比 r * (1 + eps) 更近,则批量添加这些分支 |
output_type | 选择输出容器,‘set’或‘ndarray’。默认为‘set’ |