2 つの numpy 配列がx
ありy
、float 値が含まれています。の各値について、 の要素を再利用せずx
に、 の最も近い要素を見つけたいと思います。出力は、x の要素のインデックスから y の要素のインデックスへの 1-1 マッピングである必要があります。これは、ソートに依存する悪い方法です。リストからペアになった各要素を削除します。ペアリングは元の入力配列の順序に依存するため、並べ替えがないと、これはうまくいきません。y
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
上記の例とは対照的に、それは一般的にはるかに大きいと想定しているため、 inx
の各値には通常多くの非常に適切な適合があり、それを効率的に見つけたいだけです。x
y
誰かがこれのために scipy kdtrees の例を示すことができますか? ドキュメントはかなりまばらです
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg