Алгоритм ближайшего соседа (ближайшего общем, вперед-ближайший, или назад-ближайший)


Я пытаюсь написать алгоритм, который может найти пользователь-указанного ближайших соседей. По заданному пользователем, я имею в виду, что пользователь может указать, будет ли это ближайший сосед, вперед-ближайшего соседа, или назад-ближайший сосед.

Идея этого кода был вдохновлен этот так пост. Хотя это не является идеальным для поиска всей массива (возможно использование searchsorted в качестве альтернативы), я хочу найти все вхождения указанного пользователем ближайшего значения в данном массиве данных. Хотя существуют и другие методы, которые могут быть использованы для достижения той же цели (например, используя накопленная сумма разниц argsorted значения), я чувствую себя ниже код легче читать/понимать, и скорее всего быстрее, так как он выполняет меньше операций, требующих прохождения всего массива данных. Что сказал, я хотел бы знать, если есть лучше (в плане скорости) для достижения такой же выходной, как этот код будет применен к набору данных, по меньшей мере ~70,000 точек данных. Больше чем само значение, я обеспокоен с индексами, при котором значения происходят.

import numpy as np

Образец Данных

sample = np.array([300, 800, 200, 500, 600, 750, 700, 450, 400, 550, 350, 900])
# sample = np.array([300, 800, 200, 500, 600, 750, 700, 450, 400, 550, 350, 900] * 2)

Основной алгоритм

def search_nearest(data, search_value, direction=None):
    """ 
    This function can find the nearest, forward-nearest, or 
    backward-nearest value in data relative to the given search value.
    """

    if not isinstance(data, np.ndarray):
        data = np.array(data)

    print("\n>>     DATA\n{}\n".format(data))
    print(">>     SEARCH VALUE\n{}\n".format(search_value))

    if direction is None:
        delta = np.abs(data - search_value)
        res = np.where(delta == np.min(delta))[0]

    elif direction == 'forward':
        delta = data - search_value
        try:
            res = np.where(delta == np.min(delta[delta >= 0]))[0]
        except:
            raise ValueError("no forward nearest match exists")

    elif direction == 'backward':
        delta = search_value - data
        try:
            res = np.where(delta == np.min(delta[delta >= 0]))[0]
        except:
            raise ValueError("no backward nearest match exists")

    print(" .. INDEX OF NEAREST NUMBER\n{}\n".format(res))
    print(" .. NUMBER AT THAT INDEX\n{}\n".format(data[res]))
    print("--------------------")

Назовите основные функции

# crd = None
crd = 'forward'
# crd = 'backward'

for val in (799, 301, 800, 250, 8, 901):
    search_nearest(sample, search_value=val, direction=crd)


414
4
задан 11 марта 2018 в 01:03 Источник Поделиться
Комментарии