首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KDTree中的python索引

KDTree中的python索引
EN

Stack Overflow用户
提问于 2015-11-20 09:54:33
回答 1查看 1.5K关注 0票数 6

给定一个点列表,如何在KDTree中获得它们的索引?

代码语言:javascript
复制
from scipy import spatial
import numpy as np

#some data
x, y = np.mgrid[0:3, 0:3]
data = zip(x.ravel(), y.ravel())

points = [[0,1], [2,2]]

#KDTree
tree = spatial.cKDTree(data)

# incices of points in tree should be [1,8]

我可以做这样的事情:

代码语言:javascript
复制
[tree.query_ball_point(i,r=0) for i in points]

>>> [[1], [8]]

这样做有意义吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 19:52:13

使用cKDTree.query(x, k, ...)查找与给定点集最近的k个邻域,x

代码语言:javascript
复制
distances, indices = tree.query(points, k=1)
print(repr(indices))
# array([1, 8])

在这种简单的情况下,您的数据集和查询点集都很小,而且每个查询点与数据集中的单个行相同,使用简单的布尔操作来广播而不是构建和查询k-D树会更快:

代码语言:javascript
复制
data, points = np.array(data), np.array(points)
indices = (data[..., None] == points.T).all(1).argmax(0)

data[..., None] == points.T(nrows, ndims, npoints)数组广播,对于较大的数据集,该数组的内存很快就会变得昂贵。在这种情况下,您可以通过正常的for循环或列表理解获得更好的性能:

代码语言:javascript
复制
indices = [(data == p).all(1).argmax() for p in points]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33823706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档