scipy.spatial.KDTree.

count_neighbors#

KDTree.count_neighbors(other, r, p=2.0, weights=None, cumulative=True)[源代码]#

计算可以形成多少个附近的对。

计算可以形成的对 (x1,x2) 的数量,其中 x1 来自 selfx2 来自 other,并且 distance(x1, x2, p) <= r

selfother 上的数据点可以选择使用 weights 参数进行加权。(见下文)

这是根据 Gray 和 Moore 描述的“两点相关”算法改编的 [1]。有关更多讨论,请参见注释。

参数:
otherKDTree

另一个从中提取点的树,可以与 self 是同一个树。

r浮点数或一维浮点数数组

产生计数的半径。使用单个树遍历搜索多个半径。如果计数是非累积的(cumulative=False),则 r 定义了 bin 的边缘,并且必须是非递减的。

p浮点数,可选

1<=p<=无穷大。要使用的闵可夫斯基 p 范数。默认值为 2.0。如果发生溢出,则有限的大 p 可能会导致 ValueError。

weights元组,类似数组或 None,可选

如果为 None,则对计数不加权。如果给出元组,则 weights[0] 是 self 中点的权重,weights[1] 是 other 中点的权重;两者都可以为 None,表示点不加权。如果给出类似数组,则 weights 是 selfother 中点的权重。为了使其有意义,selfother 必须是同一棵树。如果 selfother 是两棵不同的树,则会引发 ValueError。默认值:None

1.6.0 版本新增。

cumulative布尔值,可选

返回的计数是否为累积的。当 cumulative 设置为 False 时,该算法经过优化,可与由 r 指定的大量 bin(>10)一起使用。当 cumulative 设置为 True 时,该算法经过优化,可与少量的 r 一起使用。默认值:True

1.6.0 版本新增。

返回:
result标量或一维数组

对的数量。对于未加权的计数,结果为整数。对于加权的计数,结果为浮点数。如果 cumulative 为 False,则 result[i] 包含计数,其中 (-inf if i == 0 else r[i-1]) < R <= r[i]

注释

对计数是用于从由对象位置组成的数据集中计算两点相关函数的基本操作。

两点相关函数测量对象的聚类,并在宇宙学中广泛用于量化我们宇宙中的大规模结构,但它可能对其他领域中的数据分析也很有用,在这些领域中,对象的自相似组装也会发生。

用于测量 D 中聚类信号的 D 的两点相关函数的 Landy-Szalay 估计器。 [2]

例如,给定两组对象的位置,

  • 对象 D (数据)包含聚类信号,并且

  • 对象 R (随机)不包含信号,

\[\xi(r) = \frac{<D, D> - 2 f <D, R> + f^2<R, R>}{f^2<R, R>},\]

其中括号表示在 r (距离)附近的有限 bin 中对两个数据集之间的对进行计数,对应于设置 cumulative=False,并且 f = float(len(D)) / float(len(R)) 是来自数据和随机的对象数量之间的比率。

此处实现的算法大致基于 [1] 中描述的双树算法。我们根据 cumulative 的设置在两种不同的对累积方案之间切换。当 cumulative == False 时,我们使用的方法的计算时间不会随着 bin 的总数而缩放。当 cumulative == True 时,该算法与 bin 的数量线性缩放,尽管当仅使用 1 或 2 个 bin 时,它会稍微快一些。 [5]

作为对朴素对计数的扩展,加权对计数计算权重的乘积而不是对的数量。加权对计数用于估计标记的相关函数([3],第 2.2 节),或正确计算每个距离 bin 的数据的平均值(例如,[4],关于红移的第 2.1 节)。

[1] (1,2)

Gray 和 Moore,“统计学习中的 N 体问题”,Mining the sky,2000,https://arxiv.org/abs/astro-ph/0012333

[2]

Landy 和 Szalay,“角度相关函数的偏差和方差”,The Astrophysical Journal,1993,http://adsabs.harvard.edu/abs/1993ApJ…412…64L

[3]

Sheth、Connolly 和 Skibba,“星系形成模型中的标记相关性”,Arxiv 预印本,2005,https://arxiv.org/abs/astro-ph/0511773

[4]

Hawkins 等人,“2dF 星系红移调查:相关函数、特殊速度和宇宙的物质密度”,Monthly Notices of the Royal Astronomical Society,2002,http://adsabs.harvard.edu/abs/2003MNRAS.346…78H

示例

您可以计算两个 kd 树在一定距离内的邻居数

>>> import numpy as np
>>> from scipy.spatial import KDTree
>>> rng = np.random.default_rng()
>>> points1 = rng.random((5, 2))
>>> points2 = rng.random((5, 2))
>>> kd_tree1 = KDTree(points1)
>>> kd_tree2 = KDTree(points2)
>>> kd_tree1.count_neighbors(kd_tree2, 0.2)
1

此数字与 query_ball_tree 计算的总对数相同

>>> indexes = kd_tree1.query_ball_tree(kd_tree2, r=0.2)
>>> sum([len(i) for i in indexes])
1