float値を含むnumpy配列が2つあります。x
とy
です。 x
の各値について、y
の要素を再利用することなく、最も近い要素をy
に配置したいと考えています。出力は、xからyまでの要素のインデックスまでの要素のインデックスの1-1のマッピングでなければなりません。ソートに頼ることは悪いことです。これは、リストからペアになった各要素を削除します。ソートしなければ、ペアリングは元の入力配列の順序に依存するため、これは悪いことになります。Pythonの2つのリスト/配列に最も近いアイテムを見つける
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でこれを行う最善の方法は何ですか?ありがとう。
編集:私はすべてのelemets全体でベストフィット(例えば距離の和を最小化することではない)のではなく、各要素のための最良のフィットを見つけようとしていないよ、それは費用で時々だ場合、それは大丈夫だと明確にします他の要素の。私はy
が上記の例とは逆に一般にx
よりもかなり大きいと仮定しているので、x
の各値には通常多くの良い適合があり、y
にあります。
誰かがこれに対してscipy kdtreesの例を表示できますか?ドキュメントはかなりまばらで
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg
インデックスを検索するためのバイナリ検索の並べ替えはおそらく最善の策だと思います。 – mgilson
@mgilton:scipy/numpyにバイナリサーチアルゴスが組み込まれていますか? – user248237dfsf
はい:[numpy.searchsorted](http://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html) – mgilson