Mam dwie niezliczone tablice x
i y
zawierające wartości zmiennoprzecinkowe. Dla każdej wartości w x
, chcę znaleźć najbliższy element w y
, bez ponownego użycia elementów z y
. Wyjście powinno być 1-1 mapowaniem indeksów elementów od x do indeksów elementów od y. Oto zły sposób na to, który polega na sortowaniu. Usuwa każdy sparowany element z listy. Bez sortowania byłoby to złe, ponieważ parowanie zależałoby od kolejności oryginalnych tablic wejściowych.znajdowanie najbliższych pozycji na dwóch listach/tablicach w Pythonie
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]
wolę zrobić to bez sortowania elementów pierwszy, ale jeśli są one klasyfikowane następnie chcę uzyskać indeksy w oryginalnych, nieposortowane list unsorted_x
, unsorted_y
. jaki jest najlepszy sposób robienia tego w numpy/scipy/Python lub przy użyciu pand? dzięki.
edit: wyjaśnić, ja nie staram się znaleźć najlepsze dopasowanie we wszystkich elemets (nie minimalizuje sumę odległości, na przykład), ale raczej najlepsze dopasowanie do każdego elementu, i to jest w porządku, czy to czasem kosztem innych elementów. Zakładam, że y
jest na ogół o wiele większy niż x
w przeciwieństwie do powyższego przykładu, więc zazwyczaj istnieje wiele bardzo dobrych pasowań dla każdej wartości x
w y
, i chcę tylko znaleźć to wydajnie.
Czy ktoś może pokazać przykład scipy kdtrees do tego? Docs są dość skąpe
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg
Myślę, że sortowanie z wyszukiwaniem binarnym w celu znalezienia indeksu jest prawdopodobnie najlepszym rozwiązaniem. – mgilson
@mgilton: czy są wbudowane algos w poszukiwaniu scipy/numpy? – user248237dfsf
Tak: [numpy.searchsorted] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html) – mgilson