Python3.6传递数组切片时出错

Python3.6传递数组切片时出错,python,python-3.x,matplotlib-basemap,python-3.6,rodeo,Python,Python 3.x,Matplotlib Basemap,Python 3.6,Rodeo,我试图在函数(obs_ascsplot(d))中使用basemap绘制一些数据。我将一个netcdf4对象传递给函数。我提取变量并检查形状。然后我只传递子图的2D切片。但是,错误表明我传递了1D。我看不出这怎么可能。我已经包括了下面的函数和调用。非常感谢你对正在发生的事情的看法。我正在竞技IDE中使用Python3.6 提前谢谢 def obs_ascsplot(d): fig = plt.figure(2,(11.,8.),dpi=dpi) grid_top = ImageGr

我试图在函数(obs_ascsplot(d))中使用basemap绘制一些数据。我将一个netcdf4对象传递给函数。我提取变量并检查形状。然后我只传递子图的2D切片。但是,错误表明我传递了1D。我看不出这怎么可能。我已经包括了下面的函数和调用。非常感谢你对正在发生的事情的看法。我正在竞技IDE中使用Python3.6

提前谢谢

def obs_ascsplot(d):
    fig = plt.figure(2,(11.,8.),dpi=dpi)
    grid_top = ImageGrid(fig, 111, nrows_ncols = (3,2),
                         cbar_location = "bottom",
                         cbar_mode="single",
                         label_mode = "L",
                         share_all=True,
                         cbar_size="3%",
                         cbar_pad="2%",
                         aspect = True,
                         axes_pad=0.2)
    txt = ['(A)','(D)','(B)','(E)','(C)','(F)']
    asky = d.variables['ca_asky'][:]
    csky = d.variables['ca_csky'][:]
    print(type(asky), 'shape = ',asky.shape)
    print(type(csky), 'shape = ',csky.shape)
    lon = d.variables['lon'][:]
    lat = d.variables['lat'][:]
    for g,pos in zip(grid_top,range(6)):
        plt.sca(g)
        print('Ploting figure %d'%(pos+1))
        M = Basemap(projection='hammer',lon_0=0.0,lat_0=0.0,resolution='l')
        M.drawcoastlines()
        M.drawparallels(np.arange(-90.,120.,30.))
        M.drawmeridians(np.arange(0.,400.,60.))
        index = pos//2
        if(pos in [0,2,4]):
            I = M.pcolormesh(lon,lat,asky[index,:,:],vmin=240.,vmax=290.,
                             latlon=True,cmap=mycmap,shading='flat')
            plt.annotate(txt[pos], xy=(0,1), xycoords='axes fraction')
        else:
            I = M.pcolormesh(lon,lat,csky[index,:,:],vmin=240.,vmax=290.,
                             latlon=True,cmap=mycmap,shading='flat')
            plt.annotate(txt[pos], xy=(0,1), xycoords='axes fraction')
        pdb.set_trace()
    cb = grid_top.cbar_axes[0].colorbar(I)
    fig.savefig(fdir+'mhs_obs_as_cs.pdf',dpi=dpi)
    plt.show()
    return None

if __name__ == "__main__":
    #   Main script below
    # get obs and model
    idir = './data/latest/'
    i25  = 'month_means_oifs_mmr_rt_cv_mmr_t511_2007_25_0.nc'
    i30  = 'month_means_oifs_mmr_rt_cv_mmr_t511_2007_30_0.nc'
    d25  = nc.Dataset(idir+i25,'r')
    d30  = nc.Dataset(idir+i30,'r')
    print(d25.variables.keys())
    print(d30.variables.keys())
    x = obs_ascsplot(d25)


odict_keys(['masky', 'month', 'ch', 'lat', 'lon', 'mcsky', 'mce', 'msi', 'mzm', 'ma_asky', 'ma_csky', 'ma_ce', 'ma_si', 'asky', 'months', 'csky', 'ce', 'si', 'zm', 'ca_asky', 'ca_csky', 'ca_ce', 'ca_si'])
odict_keys(['masky', 'month', 'ch', 'lat', 'lon', 'mcsky', 'mce', 'msi', 'mzm', 'ma_asky', 'ma_csky', 'ma_ce', 'ma_si', 'asky', 'months', 'csky', 'ce', 'si', 'zm', 'ca_asky', 'ca_csky', 'ca_ce', 'ca_si'])

<class 'numpy.ma.core.MaskedArray'> shape =  (3, 512, 1024)
<class 'numpy.ma.core.MaskedArray'> shape =  (3, 512, 1024)
Ploting figure 1
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py:1623: MatplotlibDeprecationWarning: The get_axis_bgcolor function was deprecated in version 2.0. Use get_facecolor instead.
  fill_color = ax.get_axis_bgcolor()
IndexError: Inconsistant shape between the condition and the input (got (1024,) and (512, 1024))
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-93-be39a3427e68> in <module>()
--> 191     x = obs_ascsplot(d25)
<ipython-input-93-be39a3427e68> in obs_ascsplot(d)
     94         if(pos in [0,2,4]):
     95             I = M.pcolormesh(lon,lat,asky[index,:,:],vmin=pmin,vmax=pmax,
---> 96                              latlon=True,cmap=mycmap,shading='flat')
     97             plt.annotate(txt[pos], xy=(0,1), xycoords='axes fraction')
     98         else:
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py in with_transform(self, x, y, data, *args, **kwargs)
    516             # cylindrical and pseudo-cylindrical projections.
    517             if self.projection in _cylproj or self.projection in _pseudocyl:
--> 518                 x, data = self.shiftdata(x, data)
    519             # convert lat/lon coords to map projection coords.
    520             x, y = self(x,y)
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py in shiftdata(self, lonsin, datain, lon_0)
   4804                 lonsin = np.where(mask,1.e30,lonsin)
   4805                 if datain is not None and mask.any():
-> 4806                     datain = ma.masked_where(mask, datain)
   4807         if datain is not None:
   4808             return lonsin, datain
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/ma/core.py in masked_where(condition, a, copy)
   1913     if cshape and cshape != ashape:
   1914         raise IndexError("Inconsistant shape between the condition and the input"
-> 1915                          " (got %s and %s)" % (cshape, ashape))
   1916     if hasattr(a, '_mask'):
   1917         cond = mask_or(cond, a._mask)
IndexError: Inconsistant shape between the condition and the input (got (1024,) and (512, 1024))
def obs_ascsplot(d):
图=plt.图(2,(11,8.),dpi=dpi)
grid_top=图像栅格(图111,nrows_ncols=(3,2),
cbar_location=“底部”,
cbar_mode=“单一”,
label_mode=“L”,
分享所有=真实,
cbar_size=“3%”,
cbar_pad=“2%”,
方面=正确,
轴(U垫=0.2)
txt=['(A)'(D)'(B)'(E)'(C)'(F)']
asky=d.variables['ca_asky'][:]
csky=d.variables['ca_csky'][:]
打印(键入(asky),'shape=',asky.shape)
打印(类型(csky),'shape=',csky.shape)
lon=d.variables['lon'][:]
lat=d.variables['lat'][:]
对于g,拉链中的位置(网格顶部,范围(6)):
plt.sca(g)
打印('绘图图形%d'(位置+1))
M=底图(投影='hammer',长0=0.0,纬度0=0.0,分辨率='l')
M.海岸线()
M.drawparallels(np.arange(-90,120,30.))
子午线(np.arange(0,400,60.))
索引=位置//2
如果(位置在[0,2,4]):
I=M.pcolormesh(lon,lat,asky[index,:,:],vmin=240,vmax=290。,
latlon=True,cmap=mycmap,着色为“平坦”)
plt.annotate(txt[pos],xy=(0,1),xycoords=(轴分数)
其他:
I=M.pcolormesh(lon,lat,csky[index,:,:],vmin=240,vmax=290。,
latlon=True,cmap=mycmap,着色为“平坦”)
plt.annotate(txt[pos],xy=(0,1),xycoords=(轴分数)
pdb.set_trace()
cb=栅格\顶部。cbar\轴[0]。颜色条(I)
图savefig(fdir+'mhs_obs_as_cs.pdf',dpi=dpi)
plt.show()
一无所获
如果名称=“\uuuuu main\uuuuuuuu”:
#主脚本如下
#获取obs和模型
idir='/数据/最新/'
i25=“月”表示“月”\uOifs\uMMR\uRT\uCV\uMMR\uT511\u2007\u25\u0.nc”
i30=‘月份’指的是月日、月日、月日、月日、月日、月日、月日、月日、月日、月日、月日、月日、月日、月日、月日
d25=nc.Dataset(idir+i25,'r')
d30=nc.Dataset(idir+i30,'r')
打印(d25.variables.keys())
打印(d30.variables.keys())
x=obs\U ascsplot(d25)
odict_键(['masky'、'month'、'ch'、'lat'、'lon'、'mcsky'、'mce'、'msi'、'mzm'、'ma_-csky'、'ma_-ce'、'ma_-si'、'asky'、'csky'、'ce'、'si'、'zm'、'ca_-csky'、'ca_-ce')
odict_键(['masky'、'month'、'ch'、'lat'、'lon'、'mcsky'、'mce'、'msi'、'mzm'、'ma_-csky'、'ma_-ce'、'ma_-si'、'asky'、'csky'、'ce'、'si'、'zm'、'ca_-csky'、'ca_-ce')
形状=(3,512,1024)
形状=(3,512,1024)
绘图图1
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/mpl_工具包/basemap/_init___;.py:1623:matplotlibdeprecation警告:get_axis_bgcolor函数在2.0版中被弃用。改用get_facecolor。
fill\u color=ax.get\u axis\u bgcolor()
索引器:条件和输入之间的不一致形状(get(1024,)和(512,1024))
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
-->191 x=obs_ascsplot(d25)
在obs_ascslot(d)中
94如果(位置在[0,2,4]):
95 I=M.pcolormesh(lon,lat,asky[index,:,:],vmin=pmin,vmax=pmax,
--->96 latlon=True,cmap=mycmap,着色为“平坦”)
97 plt.注释(txt[pos],xy=(0,1),xycoords=(轴分数)
98其他:
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mpl_工具包/basemap/__;u init___;.py随_u转换(self、x、y、data、*args、**kwargs)
516#圆柱和伪圆柱投影。
517如果在_cylproj中自投影或在_pseudocyl中自投影:
-->518 x,数据=self.shiftdata(x,数据)
519#将lat/lon坐标转换为地图投影坐标。
520 x,y=self(x,y)
/shiftdata中的opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mpl_工具包/basemap/__-init___;.py(self、lonsin、datain、lonu 0)
4804 lonsin=np.where(掩码,1.e30,lonsin)
4805如果datain不是None和mask.any():
->4806数据输入=ma.屏蔽,其中(屏蔽,数据输入)
4807如果数据输入不是无:
4808返回lonsin,数据输入
/masked_where中的opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/ma/core.py(条件,a,副本)
1913如果cshape和cshape!=阿萨佩:
1914 raise INDEXROR(“条件和输入之间的形状不一致”)
->1915“(获得%s和%s)”%(C形状,ashape))
1916如果hasattr(一个“U面具”):
1917 cond=遮罩或(cond,a..。\U遮罩)
索引器:条件和输入之间的不一致形状(get(1024,)和(512,1024))

如果您在调用
pcolormesh
之前立即检查
asky[index,:,:].shape
asky[index,:,::].mask.shape
,您会怎么做?我想知道掩码是否以某种方式获得了与底层数据不一致的形状。感谢您检查“.mask.shape”的想法,这是我不知道的。以下是结果:shape=(3,512,1024)shape=(3,512,1024)绘制图1 asky[index,:,:]。shape=(512,1024)和asky[index,:,:]。mask.shape=(512,1024)indexer:条件和输入之间的形状不一致(get(1024,)