0

我已经定义了一个球树对象列表,如下所示,其中input1是一个形状为 (100, 320) 的 NumPy 数组。

bt = []
bt.append(BallTree(input1)) 

我将 的元素之一input1作为示例查询,sample_index假设在范围内。

sample_query = input1[sample_index,:]

# Find nearest neighbour and compute distance and index
distance, index = bt[0].query(sample_query,1)

鉴于 ' sample_query distance[0]' 是input1.

# Adding another BallTree instance to the list
#input2 is a numpy array with shape (70,320)  
bt.append(BallTree(input2))
distance, index = bt[0].query(sample_query,1)
print distance[0]
# Output here is NOT zero (NOT expected!!)

为什么当我将一个球树对象附加到球树列表“bt”时,“sample_query”和 bt[0] 的最近邻距离会发生变化?当我将一个对象附加到列表 bt 时,我希望对象 bt[0] 不会被修改。我的预期正确吗?

4

2 回答 2

2

在这两种情况下,您仍在对同一个球树实例进行查询,bt[0]因此您两次得到相同的结果,这是意料之中的。我不明白你为什么将 BallTree 实例放在 python 列表 BTW 中。

于 2012-09-05T21:09:26.773 回答
0

通过这个例子,我发现我对 BallTree 的理解存在差距。

经过一番挖掘,我现在明白(借用问题中的符号) bt[0].data 实际上指向输入 numpy 数组,而不是它的副本。我正在重新使用输入 numpy 数组来创建更多的球树,因此 bt[0] 看到的数据每次都被破坏。

如果我确保为每个球树实例创建 numpy 数组(或在“C-speak”中分配),那么球树查询结果是一致的。

于 2012-09-06T04:48:04.003 回答