Ich habe zwei Nummernfelder x
und y
enthält Float-Werte. Für jeden Wert in x
möchte ich das nächste Element in y
finden, ohne Elemente aus y
wiederzuverwenden. Die Ausgabe sollte eine 1-1-Abbildung von Indizes von Elementen von x zu Indizes von Elementen von y sein. Hier ist ein schlechter Weg, dies zu tun, der auf Sortieren beruht. Es entfernt jedes Element, das gepaart wurde, aus der Liste. Ohne zu sortieren wäre dies schlecht, da die Paarung von der Reihenfolge der ursprünglichen Eingabearrays abhängen würde.Finden der nächsten Elemente über zwei Listen/Arrays in Python
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]
ziehe ich es zu tun, ohne die Elemente erste Sortierung, aber wenn sie sortiert werden dann will ich die Indizes in den ursprünglichen, unsortierten Listen unsorted_x
, unsorted_y
zu bekommen. Was ist der beste Weg dies in numpy/scipy/Python oder mit Pandas zu tun? Vielen Dank.
bearbeiten: um zu klären, ich versuche nicht, die beste Passform über alle Elemente zu finden (nicht Minimierung Summe der Abstände zum Beispiel), sondern die beste Passform für jedes Element, und es ist in Ordnung, wenn es manchmal auf Kosten anderer Elemente. Ich nehme an, dass y
im Allgemeinen viel größer ist als x
im Gegensatz zu oben genannten Beispiel und so gibt es in der Regel viele sehr gute passt für jeden Wert von x
in y
, und ich möchte nur, dass man effizient zu finden.
Kann jemand ein Beispiel von scipy kdtrees dafür zeigen? Die Dokumente sind recht spärlich
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg
Ich denke, eine Art mit einer binären Suche, um den Index zu finden, ist wahrscheinlich Ihre beste Wette. – mgilson
@mgilton: Sind in Binärsuche Algos in scipy/numpy gebaut? – user248237dfsf
Yep: [numpy.searchsorted] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html) – mgilson