我需要在四个维度(纬度、经度、高度和时间)上线性插值温度数据。
数据点数量相当高(360x720x50x8),我需要一种快速计算数据边界内任意空间和时间点温度的方法。
我尝试使用scipy.interpolate.LinearNDInterpolator
,但在矩形网格上使用Qhull进行三角剖分效率低下,需要数小时才能完成。
通过阅读这篇SciPy问题,解决方案似乎是使用标准的interp1d
实现一个新的nd interpolator来计算更多的数据点,然后使用新数据集进行“最近邻”方法。
然而,这又需要很长的时间(几分钟)。
是否有一种快速的方法可以在四个维度的矩形网格上插值数据而不需要花费几分钟的时间?
我考虑了4次使用interp1d
而不计算更高密度点的方法,但让用户使用坐标来调用,但我无法理解如何做到这一点。
否则,编写特定于我的需求的自己的4D interpolator是否可行?
以下是我用来测试这个问题的代码:使用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)
非常感谢您的帮助!