scipy.spatial.KDTree和scipy.spatial.cKDTree之间的区别

47

这两种算法有何不同之处?


1
此外,cKDTree 更容易进行线程处理,因为它可能不会受到 GIL 的影响(有关更多信息,请参见 scipy.spatial 邮件列表)。不确定实现了哪个版本的 cKDTree 没有 GIL - Trevor Boyd Smith
4个回答

51

cKDTreeKDTree的一个子集,在C ++中实现并用Cython封装,因此更快。

它们每个都是一个二叉trie,每个节点表示轴对齐的超矩形。每个节点指定一个轴,并根据点沿该轴的坐标是否大于或小于特定值来分割点集。

KDTree还支持所有邻居查询,包括使用点数组和其他kd树。这些确实使用了一种相当有效的算法,但是kd树不一定是这种计算的最佳数据结构。


16
我很惊讶在KDTree的文档和文章中没有更突出地宣传这个。就我寻找约20,000个点的三维邻居这个简单(并且可能常见)的应用来说,cKDTree要快40倍。 - pythonjsgeo
1
@cagf - cKDTree 实际上是用 C++ 实现的。你能接受一次编辑吗? - gansub
1
@gansub 我找到了它:https://github.com/scipy/scipy/tree/master/scipy/spatial/ckdtree/src - agf
2
“所有邻居查询”是什么样子?我猜它有点像并行化版本,一次性询问许多点的最近点。有人可以确认吗? - Nathan majicvr.com
2
我和弗兰克在一起。我不知道什么是“所有邻居查询”。你能解释一下“所有邻居查询”是什么吗? - Trevor Boyd Smith
显示剩余4条评论

16

在一个使用情况中(在大约有10万个点的KD树中进行5D最近邻居查找),cKDTree比KDTree快大约12倍。


2
另一个数据点:在24维度中的1,640个点中找到大约50,000个测试向量的两个最近邻居:KDTree-2m 32s / cKDTree-360ms。 - Matti Wens
1
如果能进行速度测试并确认,或者包括@agf提到的“所有邻居查询”,这个回答将会更有帮助。 - Nathan majicvr.com

3

2022年更新:cKDTree已被弃用

当前(v1.8)SciPy文档指出,scipy.spatial.cKDTree现已被弃用,并被功能相同的scipy.spatial.KDTree所取代。

这里是说明:

cKDTree与KDTree在功能上完全相同。在SciPy v1.6.0之前,cKDTree性能更好,功能略有不同,但现在这两个名称仅为向后兼容而存在。如果不需要与SciPy < 1.6兼容,请优先使用KDTree。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接