Finde Elemente des Arrays eins, die den Elementen des Arrays zwei am nächsten sind

Diese Antwort erklärt, wie man das nächste (sortierte) Array-Element zu einem @ findeinziger Punk, effizient für große Arrays (leicht modifiziert):

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 suchen möchten, die einem @ am nächsten liegeinstelle von Punkten (d. h. eine zweite Anordnung); Gibt es effiziente Möglichkeiten (nach Geschwindigkeit für große Arrays), dies zu erweitern, außer eine for-Schleife zu verwenden?

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: Unter der Annahme, dass beide Arrays sortiert sind, können Sie einweni besser als einvollständi naive for-Schleife durch Ausschließen von Werten unterhalb der bereits übereinstimmenden Werte, d. h.

def args_nearest(options, targets):
    locs = np.zeros(targets.size, dtype=int)
    prev = 0
    for ii, tt in enumerate(targets):
        locs[ii] = prev + arg_nearest(options[prev:], tt)
        prev = locs[ii]
    return locs

Antworten auf die Frage(2)

Ihre Antwort auf die Frage