This answer erläutert, wie die am nächsten zu finden (sortiert) Array-Element an einem Einpunkt, in einer Art und Weise effizient für große Arrays (leicht modifiziert):Elemente der Matrix einen nächsten an Elementen der Array zwei
def arg_nearest(array, value):
idx = np.searchsorted(array, value, side="left")
if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
return idx-1
else:
return idx
Wenn wir stattdessen die Array-Elemente am nächsten zu einem Set von Punkten (dh ein zweites Array) suchen möchten; gibt es effiziente (durch Geschwindigkeit, für große Arrays) Möglichkeiten, dies zu erweitern, abgesehen von der Verwendung einer For-Schleife?
Einige Testfälle:
>>> xx = [0.2, 0.8, 1.3, 1.5, 2.0, 3.1, 3.8, 3.9, 4.5, 5.1, 5.5]
>>> yy = [1, 2, 3, 4, 5]
>>> of_x_nearest_y(xx, yy)
[0.5, 2.0, 3.1, 3.9, 5.1]
>>> xx = [0.2, 0.8, 1.3, 1.5, 2.0, 3.1, 3.8, 3.9, 4.5, 5.1, 5.5]
>>> yy = [-2, -1, 4.6, 5.8]
>>> of_x_nearest_y(xx, yy)
[0.2, 0.2, 4.5, 5.5]
Edit: vorausgesetzt, beide Arrays sortiert sind, können Sie eine wenig besser als ein vollständig naive for-Schleife tun, indem Werte unter den bereits abgestimmt ausgenommen , dh
'searchsorted' benötigt ein Array von Werten, nach denen gesucht werden soll. Es ist also nicht zu schwierig,' arg_nearest' für Ihren Job zu ändern. – user2357112
@ user2357112 hmmm, guter Punkt! – DilithiumMatrix