我试图同时返回count
(邻居的数量)和ind
(这些邻居的索引),但除非我调用两次query_radius
,否则无法实现。尽管这在计算上很密集,但实际上在 Python 中对我来说比遍历ind
并计算每行的尺寸更快!这似乎非常低效,所以我想知道是否有办法在一个调用中返回它们?
我尝试在调用query_radius
后访问tree
的count
和ind
对象,但它们不存在。在 numpy 中没有有效的方法来做到这一点,对吗?
>>> array = np.array([[1,2,3], [2,3,4], [6,2,3]])>>> tree = KDTree(array)>>> neighbors = tree.query_radius(array, 1)>>> tree.indTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'sklearn.neighbors.kd_tree.KDTree' object has no attribute 'ind'>>> tree.countTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'sklearn.neighbors.kd_tree.KDTree' object has no attribute 'count'
回答:
考虑以下数据集:
array = np.random.random((10**5, 3))*10tree = KDTree(array)
正如你在问题中指出的,有三种选择:
1) 调用两次tree.query_radius
来获取邻居及其数量。
neighbors = tree.query_radius(array, 1)counts = tree.query_radius(array, 1, count_only=1)
这需要8.347秒。
2) 仅获取邻居,然后通过遍历它们来获取数量:
neighbors = tree.query_radius(array, 1)counts = []for i in range(len(neighbors)): counts.append(len(neighbors[i]))
这比第一种方法显著快,耗时4.697秒
3) 现在,我们可以改进计算counts
的循环时间。
neighbors = tree.query_radius(array, 1)len_array = np.frompyfunc(len, 1, 1)counts = len_array(neighbors)
这是最快的,耗时4.449秒。