Python scipy 3D-интерполяция / таблица поиска

У меня есть данные, созданные Comsol, которые я хотел бы использовать в качестве таблицы поиска в программе Python/Scipy, которую я создаю. Вывод comsol выглядит как B(ri,thick,L) и будет содержать примерно 20 000 записей. Пример вывода показан ниже для уменьшенной версии 3x3x3.

Хотя я нашел много хороших решений для 3D-интерполяции, используя, например. Regulargridinterpolator (первая ссылка ниже), я все еще ищу решение с использованием стиля таблицы поиска. Вторая ссылка ниже кажется близкой, однако я не уверен, как метод интерполирует все три измерения.

Мне трудно поверить, что таблица поиска требует такой сложной реализации, поэтому любые предложения приветствуются!

Пример данных COMSOL

интерполировать трехмерный объем с помощью numpy и/или scipy

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


person Teyber    schedule 09.07.2017    source источник


Ответы (1)


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

Вместо этого я использовал cKDtree, чтобы найти соответствующую запись в разбросанной таблице поиска / файле данных и назначить ее правильной записи трехмерного массива numpy (вы можете сохранить этот массив numpy в файл, если хотите). Затем я использую интерполятор прямоугольной сетки для этого массива. Ошибки составляли порядка 0,5%, что на порядок лучше, чем у cKDtree.

import numpy as np
from scipy.spatial import cKDTree
from scipy.interpolate import RegularGridInterpolator

l_data = np.linspace(.125,0.5,16)# np.linspace(0.01,0.1,10) #Range for "short L"
ri_data = np.linspace(0.005,0.075,29)
thick_data = np.linspace(0.0025,0.1225,25)
#xyz data with known bounds above
F = np.zeros((np.size(l_data),np.size(ri_data),np.size(thick_data)))


LUT = np.genfromtxt('a_data_file.csv', delimiter = ',')
F_val = LUT[:, 3]
tree_small_l = cKDTree(LUT[:, :3]) #xyz coords

for ri_iter in np.arange(np.size(ri_data)):
    for thick_iter in np.arange(np.size(thick_data)):
        for l_iter in np.arange(np.size(l_data)):    
            dist,ind = tree_small_l.query(((l_data[l_iter],ri_data[ri_iter],thick_data[thick_iter])))
            F[l_iter,ri_iter,thick_iter] = F_val[ind].T 

interp_F_func = RegularGridInterpolator((l_data, ri_data, thick_data), F)
person Teyber    schedule 26.07.2017