Пытаясь найти хорошую технику интерполяции - PullRequest
0 голосов
/ 31 января 2020

В настоящее время я пытаюсь интерполировать большой набор значений X и Y, используя Python. Массивы довольно длинные (6 миллионов значений), и я пытаюсь расширить это до 10 миллионов значений. Учитывая мою проблему, интерполяция не должна go выше или ниже минимального / максимального значения Y. Поэтому для этого я написал функцию для выполнения интерполяции с обратным взвешенным расстоянием (IDW). Однако это займет слишком много времени (по крайней мере, 10 дней) для завершения. Я использовал IDW, потому что данные также довольно шумные, и, установив значение p <1.0, он немного сглаживает их. Вот функция, которую я написал: </p>

def idw_simple(x, y, x_new, p):
    # interpolate 2D data using inverse distance weighted technique
    y_new = np.array([])

    for i in x_new:
        # Calc. distance for each x_new-value from every x-value 
        min_array = np.abs(x - i)
        min_array_sorted = np.sort(min_array)

        # Find 10 closest x-values 
        near_indices = [int(np.where(min_array == k)[0]) for k in min_array_sorted[:10]]

        # Calc. y_new based on nearby weighted points
        near_indices = np.sort(near_indices)
        weights = 1 / (min_array[near_indices] ** p)
        y_new = np.append(y_new, np.sum(weights * y[near_indices]) / weights.sum())

    return y_new

Если у кого-то есть идея, как ускорить его, ИЛИ, если вы думаете, что есть другой метод интерполяции, который даст аналогичные результаты, я бы хотел услышать, что думают люди. ,

1 Ответ

1 голос
/ 31 января 2020

Если входные данные отсортированы в порядке возрастания x, вы можете сделать шаг «10 ближайших точек» намного более эффективно. Перед инициализацией l oop j = 0, затем в верхней части вашего тела i l oop сделайте

while j < len(x) - 10 and abs(x[j+10] - i) < abs(x[j] - i):
    j = j + 1

, а затем x[j:j+10] и y[j:j+10] будут 10 ближайшими точками до i в каждой итерации l oop, без необходимости сортировать и фильтровать списки из 10 миллионов элементов каждый раз. Это должно быть в разы быстрее.

...