scipy 笔记:spatial.KDTree

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’

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值