我有两个包含浮点数值的numpy数组 x
和 y
。对于每个x
中的值,我想找到y
中最接近的元素,不重复使用y
中的元素。输出应该是x元素索引到y元素索引的一一映射。以下是一个不好的做法,它依赖于排序。它会从列表中删除配对的每个元素。不排序会很糟糕,因为匹配将取决于原始输入数组的顺序。
def min_i(values):
min_index, min_value = min(enumerate(values),
key=operator.itemgetter(1))
return min_index, min_value
# unsorted elements
unsorted_x = randn(10)*10
unsorted_y = randn(10)*10
# sort lists
x = sort(unsorted_x)
y = sort(unsorted_y)
pairs = []
indx_to_search = range(len(y))
for x_indx, x_item in enumerate(x):
if len(indx_to_search) == 0:
print "ran out of items to match..."
break
# until match is found look for closest item
possible_values = y[indx_to_search]
nearest_indx, nearest_item = min_i(possible_values)
orig_indx = indx_to_search[nearest_indx]
# remove it
indx_to_search.remove(orig_indx)
pairs.append((x_indx, orig_indx))
print "paired items: "
for k,v in pairs:
print x[k], " paired with ", y[v]
我更喜欢不先对元素进行排序,但如果它们已经排序,则想要获取原始未排序列表unsorted_x
,unsorted_y
中的索引。在numpy/scipy/Python或使用pandas中,最好的方法是什么?谢谢。
编辑:为了澄清,我不是试图找到所有元素的最佳拟合(例如最小化距离总和),而是每个元素的最佳拟合,即使有时会牺牲其他元素也可以。我假设y
通常比上述示例中的x
大得多,因此对于x
在y
中的每个值,通常有许多非常好的拟合,并且我只想高效地找到其中一个。
有人能展示一下用scipy的kdtrees的例子吗?文档非常稀少。
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg
scipy.spatial.cKDTree
(或旧版 scipy 中的 KDTree)。当然,如果你小心处理,argsorting 也可以实现。 - sebergtree = KDTree(x[:,None]); tree.query(y[:,None], k=1)
会找到所有y
中最接近的x
(基于二次范数,你可以进行更改)。 - seberg