我将从底图转向制图,因为底图将被淘汰。我以前使用过basemap.interp功能来插值数据,例如,假设我有1度分辨率(180 x360)的数据,我将运行以下命令来插值到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有插值,但我不知道如何应用它。任何帮助都将不胜感激!
3条答案
按热度按时间4si2a6ki1#
我最终决定从Basemap中提取原始代码,并将其变成一个独立的函数-我会将其推荐给cartopy的家伙来实现它,因为它是一个有用的功能。在这里发布,因为它可能对其他人有用:
--
rhfm7lfc2#
SciPy插值例程返回一个函数,你可以调用它来执行插值。对于规则网格上的最近邻插值,你可以使用
scipy.interpolate.RegularGridInterpolator
:但这并不完美,因为
lon=175
都是填充值。(如果我没有设置bounds_error=False
,那么你会在那里得到一个错误。)在这种情况下,你需要询问你想如何环绕日期行。一个简单的解决方案是将lon=0
行复制到数组的末尾,并称之为lon=180
。如果有一天你想要线性或更高阶的插值,如果你的数据是点而不是单元格,我建议你使用
scipy.interpolate.RectBivariateSpline
:a5g8bdjr3#
cartopy
现在有一个叫做cartopy.img_transform.im_trans.regrid
的函数。例如,在一个示例中,