count_neighbors#
- KDTree.count_neighbors(other, r, p=2.0, weights=None, cumulative=True)[源码]#
计算可以形成的附近配对的数量。
计算可以形成的配对
(x1,x2)
的数量,其中x1
来自self
,x2
来自other
,并且distance(x1, x2, p) <= r
。可选地,
self
和other
上的数据点由weights
参数加权。(见下文)这是从 Gray 和 Moore 描述的“两点相关”算法改编而来的 [1]。有关更多讨论,请参见注释。
- 参数:
- otherKDTree
从中提取点的另一棵树,可以与 self 相同的树。
- rfloat 或 floats 的一维数组
要生成计数的半径。使用单个树遍历搜索多个半径。如果计数是非累积的(
cumulative=False
),则r
定义 bin 的边缘,并且必须是非递减的。- pfloat, 可选
1<=p<=infinity。要使用的 Minkowski p-范数。默认值为 2.0。如果可能发生溢出,则有限大的 p 可能会导致 ValueError。
- weightstuple, array_like, 或 None, 可选
如果为 None,则配对计数为未加权。如果给定为元组,则 weights[0] 是
self
中点的权重,weights[1] 是other
中点的权重;两者都可以为 None 以指示点是未加权的。如果给定为 array_like,则 weights 是self
和other
中点的权重。要使其有意义,self
和other
必须是同一棵树。如果self
和other
是两棵不同的树,则会引发ValueError
。默认值:None1.6.0 版本新增。
- cumulativebool, 可选
返回的计数是否为累积的。当 cumulative 设置为
False
时,该算法已针对处理由r
指定的大量 bin (>10) 进行了优化。当cumulative
设置为 True 时,该算法已针对处理少量r
进行了优化。默认值:True1.6.0 版本新增。
- 返回:
- result标量或一维数组
配对的数量。对于未加权的计数,结果是整数。对于加权的计数,结果是浮点数。如果 cumulative 为 False,则
result[i]
包含(-inf if i == 0 else r[i-1]) < R <= r[i]
的计数
注释
配对计数是用于从由对象位置组成的数据集中计算两点相关函数的基本操作。
两点相关函数测量对象的聚类,并广泛用于宇宙学中以量化我们宇宙中的大规模结构,但它可能对其他领域中的数据分析有用,在这些领域中,也可能发生对象的自相似组装。
Landy-Szalay 估计量用于
D
的两点相关函数,测量D
中的聚类信号。 [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] 中描述的 dual-tree 算法。我们根据
cumulative
的设置在两种不同的配对累积方案之间切换。当我们用于cumulative == False
时使用的方法的计算时间不会随 bin 的总数而缩放。对于cumulative == True
的算法与 bin 的数量呈线性缩放,但当仅使用 1 或 2 个 bin 时,它会稍微快一些。 [5]。作为对朴素配对计数的扩展,加权配对计数计算权重的乘积而不是配对的数量。加权配对计数用于估计标记的相关函数([3],第 2.2 节),或正确计算每个距离 bin 的平均数据(例如,[4],关于红移的第 2.1 节)。
[2]Landy 和 Szalay,“角相关函数的偏差和方差”,天体物理学杂志,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 星系红移调查:相关函数、特殊速度和宇宙物质密度”,皇家天文学会月刊,2002,http://adsabs.harvard.edu/abs/2003MNRAS.346…78H
示例
您可以计算两个 kd-tree 在一定距离内的邻居数
>>> 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