我有两个 numpy 数组x
并y
包含浮点值。对于 中的每个值x
,我想在 中找到最接近的元素y
,而不重用 中的元素y
。输出应该是从 x 到 y 的元素索引的 1-1 映射。这是一种依赖排序的坏方法。它从列表中删除每个配对的元素。如果不排序,这会很糟糕,因为配对将取决于原始输入数组的顺序。
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
in的每个值都有很多非常好的拟合y
,我只想有效地找到那个。
有人可以为此展示一个 scipy kdtrees 的例子吗?文档非常稀疏
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg