可以说这是我正在实现的简单KD树算法

def Test():

    features = np.random.random((10, 2))

    X = np.array(features[0:2])
    print(X)
    tree = KDTree(features, leaf_size=40)
    indic = tree.query_radius(X, r= 0.1)

    counter = 0
    for i in indic:
        a = (features[i])
        np.savetxt('file{}.txt'.format(counter), a, fmt='%s')
        counter += 1
        yield i

tree = Test()

[X for X in tree]


在这里,我为每个目标位置的每个相邻元素保存文本文件,并且效果很好。

有什么技巧可以使我为每个目标点使用不同的搜索条件,而不必一次又一次地创建单独的树查询?

例如,假设我要对X = np.array(features[0]使用一个变量r = 0.1
另一个变量Y = np.array(features[1]r = 0.5
现在,我只能这样想

indic1 = tree.query_radius(X, r= 0.1)
indic2 = tree.query_radius(Y, r= 0.5)


有没有一种方法可以将这两者结合起来并进行一个树查询?

最佳答案

是的,从文档中仅使用一个query_radius调用就有一种方法可以做到:


  r可以是单个值,也可以是形状为x.shape [:-1]的值的数组
  如果每个点需要不同的半径。


因此,您可以这样做:

import numpy as np
from sklearn.neighbors import KDTree

np.random.seed(42)
features = np.random.random((10, 2))

X = np.array(features[0:2])
tree = KDTree(features, leaf_size=40)
indices = tree.query_radius(X, r=np.array([0.1, 0.5]))

for cursor, ix in enumerate(indices):
    np.savetxt('file{}.txt'.format(cursor), features[ix], fmt='%s')


输出为file0.txt和file1.txt,file0.txt有1个点(半径较小),而file1.txt有5个点(半径较大)。

关于python - 使用具有多个目标变量和多个搜索条件的KDtree在sklearn中查找邻居,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51907340/

10-16 12:02
查看更多