我有以下问题:
我有来自不同卫星的云量数据集,我想把它们重新整理到气候模型的网格上,以便将模型输出和观测到的卫星数据进行比较。在
目前,我使用的是basemap中的interp函数,它对于1 x经度x纬度的数组非常适用,但对于形状为nx经度x纬度的数组则不适用。重新研磨这类三维阵列的最佳方法是什么?在
from mpl_toolkits.basemap import interp
import xarray as xr
def regrid_MAR10km(x_in,y_in,data_in):
mar_10km = xr.open_dataset('/media/..../MAR_10km /MARv3.5.2-10km-ERA-2008.nc')
lat = mar_10km['LAT']
lon = mar_10km['LON']
result = interp(data_in, x_in, y_in,lon,lat)
return result
我的问题是,当我尝试使用三维数据时,我会收到以下形式的错误消息,在我的例子中,数组的形式是161(这是每个月的云量!)x长x横向
^{pr2}$这就是它产生的错误:
IndexError Traceback (most recent call last)
<ipython-input-19-5117a62e570e> in <module>()
----> 1 cloud_regrid = fc.regrid_MAR10km(longitude,latitude,cloud_data_UD)
/media/sf_Shared/Black_and_bloom/CODE/functions.py in regrid_MAR10km(x_in, y_in, data_in)
20 lat = mar_10km['LAT']
21 lon = mar_10km['LON']
---> 22 result = interp(data_in, x_in, y_in,lon,lat)
23 return result
/home/sh16450/miniconda3/envs/snowflakes/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py in interp(datain, xin, yin, xout, yout, checkbounds, masked, order)
4958 dataout = (1.-delx)*(1.-dely)*datain[yi,xi] + \
4959 delx*dely*datain[yip1,xip1] + \
-> 4960 (1.-delx)*dely*datain[yip1,xi] + \
4961 delx*(1.-dely)*datain[yi,xip1]
4962 elif order == 0:
IndexError: index 41 is out of bounds for axis 1 with size 28
从Basemap docs开始,interp方法专门处理二维数组,其中第一个维度对应于y维度(纬度),第二个维度对应于x维度(经度)。如果你再给它点什么,恐怕你最后会得不到好结果。在
实际上,由于Basemap假设您的数据是二维的,所以它试图在时间轴和纬度轴(161,28)上执行插值,就好像它们分别是经纬度一样。由于传递给该方法的经度数组(110,)现在比axis Basemap假定的经度(28,)大,最终会出现形状不匹配,从而导致索引器错误。在
我不太清楚为什么(1,28110)会起作用,但我敢打赌,NumPy在隐藏层中做了一些数组flattening或squeezing,最终基本上忽略了这个空维度。在
我建议迭代每个时间步并在二维数据片上执行插值,或者搜索scipy.interpolate文档,看看它们是否提供了一个函数来执行您所要查找的功能。在
祝你好运!在
相关问题 更多 >
编程相关推荐