Мне нужно интерполировать данные температуры линейно в 4 измерениях (широта, долгота, высота и время).
Количество точек довольно высокое (360x720x50x8), и мне нужен быстрый метод вычисления температуры в любой точке пространства и времени в пределах границ данных.
Я попытался использовать scipy.interpolate.LinearNDInterpolator
, но использование Qhull для триангуляции неэффективно на прямоугольной сетке и занимает несколько часов.
Прочитав этот билет SciPy, решение, похоже, реализовало новый nd-интерполятор с использованием стандартного interp1d
для вычисления большего числа точек данных, а затем использовать подход "ближайшего соседа" с новым набором данных.
Это, однако, занимает много времени (минуты).
Есть ли быстрый способ интерполяции данных по прямоугольной сетке в 4 измерениях без выполнения минут?
Я думал использовать interp1d
4 раза, не вычисляя более высокую плотность точек, но оставляя его для вызова пользователем с координатами, но я не могу понять, как это сделать.
В противном случае я бы написал здесь свой собственный 4D-интерполятор, специфичный для моих потребностей?
Вот код, который я использовал для тестирования:
Использование scipy.interpolate.LinearNDInterpolator
:
import numpy as np
from scipy.interpolate import LinearNDInterpolator
lats = np.arange(-90,90.5,0.5)
lons = np.arange(-180,180,0.5)
alts = np.arange(1,1000,21.717)
time = np.arange(8)
data = np.random.rand(len(lats)*len(lons)*len(alts)*len(time)).reshape((len(lats),len(lons),len(alts),len(time)))
coords = np.zeros((len(lats),len(lons),len(alts),len(time),4))
coords[...,0] = lats.reshape((len(lats),1,1,1))
coords[...,1] = lons.reshape((1,len(lons),1,1))
coords[...,2] = alts.reshape((1,1,len(alts),1))
coords[...,3] = time.reshape((1,1,1,len(time)))
coords = coords.reshape((data.size,4))
interpolatedData = LinearNDInterpolator(coords,data)
Используя scipy.interpolate.interp1d
:
import numpy as np
from scipy.interpolate import LinearNDInterpolator
lats = np.arange(-90,90.5,0.5)
lons = np.arange(-180,180,0.5)
alts = np.arange(1,1000,21.717)
time = np.arange(8)
data = np.random.rand(len(lats)*len(lons)*len(alts)*len(time)).reshape((len(lats),len(lons),len(alts),len(time)))
interpolatedData = np.array([None, None, None, None])
interpolatedData[0] = interp1d(lats,data,axis=0)
interpolatedData[1] = interp1d(lons,data,axis=1)
interpolatedData[2] = interp1d(alts,data,axis=2)
interpolatedData[3] = interp1d(time,data,axis=3)
Большое спасибо за вашу помощь!