底图插值替代 - 重新划分数据

时间:2018-02-23 10:25:40

标签: python numpy matplotlib interpolation matplotlib-basemap

鉴于底图将逐步淘汰,我将从底图转向拼贴。我之前使用过basemap.interp功能来插入数据,例如说我有1度分辨率(180x360)的数据,我会运行以下内插到0.5度。

import numpy as np
from mpl_toolkits import basemap

Old_Lon = np.linspace(-180,180,360)
Old_Lat = np.linspace(-90,90,180)
New_Lon = np.linspace(-180,180,720)
New_Lat = np.linspace(-90,90,360)

New_Lon,New_Lat = np.meshgrid(New_Lon,New_Lat)

New_Data = basemap.interp(Old_Data,Old_Lon,Old_Lat,New_Lon,New_Lat,order=0)

order为我提供了选择最近邻居,双线性等的选项。有没有其他方法可以这么简单地做到这一点?我见过scipy有插值,但我不知道如何应用它。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

SciPy插值例程返回一个可以调用以执行插值的函数。对于常规网格上的最近邻插值,可以使用scipy.interpolate.RegularGridInterpolator

import numpy as np
from scipy.interpolate import RegularGridInterpolator

nearest_function = RegularGridInterpolator(
    (old_lon, old_lat), old_data, method="nearest", bounds_error=False
)

new_data = np.array(
    [[nearest_function([i, j]) for j in new_lat] for i in new_lon]
).squeeze()

但这并不完美,因为lon=175都是填充值。 (如果我没有设置bounds_error=False,那么你会在那里得到一个错误。)在这种情况下,你需要询问你想如何包裹日期。一个简单的解决方案是将lon=0行复制到数组的末尾并将其称为lon=180

如果您希望某天进行线性或更高阶插值,如果您的数据是点而不是单元格,我建议您使用scipy.interpolate.RectBivariateSpline

import numpy as np
from scipy.interpolate import RectBivariateSpline

old_step = 10
old_lon = np.arange(-180, 180, old_step)
old_lat = np.arange(-90, 90, old_step)
old_data = np.random.random((len(old_lon), len(old_lat)))
interp_function = RectBivariateSpline(old_lon, old_lat, old_data, kx=1, ky=1)

new_lon = np.arange(-180, 180, new_step)
new_lat = np.arange(-90, 90, new_step)
new_data = interp_function(new_lon, new_lat)

答案 1 :(得分:1)

我最终决定从Basemap中获取原始代码并将其变成一个独立的函数 - 我将向推荐人员推荐它,以实现它作为一个有用的功能。在这里发布可能对其他人有用:

def min_angle_bet_hr_min(hr, min):

    angle_1 = (hr*5 - min)*6
    angle_2 = 360 - angle_1

    if angle_1 < angle_2:
        min_angle = angle_1
    elif angle_1 > angle_2:
        min_angle = angle_2
    else:
        min_angle = 0

    return abs(min_angle)

-