Подтвердить что ты не робот

Интерполяция данных из таблицы поиска

прочитать таблицу поиска

LUT = np.genfromtxt('test.out', delimiter=',', dtype=float)
LUT:
    12, 25, 136, 6743
    13, 26, 139, 6786
    14, 27, 142, 6791
    15, 28, 145, 6789

Значения для чтения из LUT следующие:

x1, x2, x3 = 12.5, 25.5, 137

Считая соседние два значения в LUT для каждого из заданных значений (3 столбца), я должен линейно интерполировать результаты (4-й столбец в LUT).

Данные значения (x1, x2, x3) относятся к 1-й и 2-й строке LUT. На основании этого, как читать результаты между 1-й и 2-й строками?

4b9b3361

Ответ 1

Учитывая список координат coords, где вы хотите интерполировать, вы можете использовать scipy.spatial.cKDTree для получения двух ближайших записей вашей таблицы, необходимых для линейной интерполяции. В приведенном ниже коде показан пример использования, уже векторизованный.

import numpy as np
from scipy.spatial import cKDTree

# inputs
LTU = np.genfromtxt('test.txt', delimiter=',')

coords = ((12.5, 25.5, 137),
          (13.5, 26.5, 141),
          (14.5, 25.5, 144))

# querying and interpolating
xyz = LTU[:, :3]
val = LTU[:, 3]

del LTU # attempt to clean up memory

tree = cKDTree(xyz)
dist, ind = tree.query(coords, k=2)

d1, d2 = dist.T
v1, v2 = val[ind].T
v = (d1)/(d1 + d2)*(v2 - v1) + v1

print(v)
#[ 6758.73909236  6789.16987298  6790.03575996]

Ответ 2

Немного неясно - контекст, с которым вы работаете.

Если это более общий LUT: найдите ближайшие 2 точки через эвклидовое расстояние ко всем точкам LUT из предоставленной точки. После установки этих двух точек используйте билинейную интерполяцию в 4-м столбце.

Теперь, если каждый столбец увеличивается в шаге блокировки w/(1, 1, 3), и у вас есть некоторое понятие порядка, найдите верхнюю и нижнюю границы с блоком bisect python первого столбца, и вы закончили поиск индексов, которые вы интерполируете с помощью (bilinearlly?). Поскольку вы упомянули в комментариях ниже дельта, исправлено это, это делает намного более 1d проблему LUT чем 3d проблема - возможно, вы могли бы использовать numpy.interp используя только первое измерение и 4-мерное измерение.

Если они не находятся на этапе блокировки, но сохраняется аналогичное упорядочение, ограничьте диапазон допустимых верхних и нижних индексов, создав кумулятивную верхнюю/нижнюю границу по столбцам, а затем определите, какие индексы вы хотели бы интерполировать с помощью этого диапазон.

Для всех, если вы находите точное значение в LUT, не мешайте интерполяции.