已知程序 import xarray as xr from collections import namedtuple import numpy as np from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter import matplotlib.ticker as mticker import cartopy.feature as cfeature import cartopy.crs as ccrs import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as mcolors def region_mask(lon, lat, extents): lonmin, lonmax, latmin, latmax = extents return ( (lon >= lonmin) & (lon <= lonmax) & (lat >= latmin) & (lat <= latmax) ) Point = namedtuple('Point', ['x', 'y']) Pair = namedtuple('Pair', ['start', 'end']) time = '2023-05-04' filepath_DPR = r"C:\pythontest\zFactor\test1.nc4" extents = [110, 122, 25, 38] with xr.open_dataset(filepath_DPR) as f: lon_DPR = f['FS_Longitude'][:] lat_DPR = f['FS_Latitude'][:] zFactorFinalNearSurface = f['FS_SLV_zFactorFinalNearSurface'][:] nscan, nray = lon_DPR.shape midray = nray // 2 mask = region_mask(lon_DPR[:, midray], lat_DPR[:, midray], extents) index = np.s_[mask] lon_DPR = lon_DPR[index] lat_DPR = lat_DPR[index] zFactorFinalNearSurface = zFactorFinalNearSurface[index] for data in [ zFactorFinalNearSurface, ]: data.values[data <= -9999] = np.nan proj = ccrs.PlateCarree() fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection=proj) ax.coastlines(resolution='50m', lw=0.5) ax.add_feature(cfeature.OCEAN.with_scale('50m')) ax.add_feature(cfeature.LAND.with_scale('50m')) ax.set_xticks(np.arange(-180, 181, 5), crs=proj) ax.set_yticks(np.arange(-90, 91, 5), crs=proj) ax.xaxis.set_minor_locator(mticker.AutoMinorLocator(2)) ax.yaxis.set_minor_locator(mticker.AutoMinorLocator(2)) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) ax.set_extent(extents, crs=proj) ax.tick_params(labelsize='large') def make_zF_cmap(levels): '''制作雷达反射率的colormap.''' nbin = len(levels) - 1 cmap = cm.get_cmap('jet', nbin) norm = mcolors.BoundaryNorm(levels, nbin) return cmap, norm levels_zF = [0, 1, 5, 10, 15, 20, 25, 30, 35, 40, 45] cmap_zF, norm_zF = make_zF_cmap(levels_zF) im = ax.contourf( lon_DPR, lat_DPR, zFactorFinalNearSurface, levels_zF, # 三个物理量为 (500, 49)就是在500*49的格点上赋予这三个物理量 cmap=cmap_zF, norm=norm_zF, extend='both', transform=proj ) cbar = fig.colorbar(im, ax=ax, ticks=levels_zF) cbar.set_label('zFactor (dBZ)', fontsize='large') cbar.ax.tick_params(labelsize='large') ax.set_title(f'DPR zFactor on {time}', fontsize='x-large') plt.show()如何将其中的zFactorFinal变量变为二维
时间: 2024-01-13 22:03:16 浏览: 385
在这段代码中,zFactorFinalNearSurface的shape是(500, 49),其中第一维是nscan(扫描线数),第二维是nray(每个扫描线的射线数)。如果要将zFactorFinalNearSurface变为二维数组,可以将nscan和nray相乘得到总的格点数,然后使用reshape方法将其变为二维数组。代码如下:
```
zFactorFinalNearSurface = zFactorFinalNearSurface[index]
nscan, nray = zFactorFinalNearSurface.shape
zFactorFinalNearSurface_2d = zFactorFinalNearSurface.reshape(nscan*nray, 1)
```
其中,index是通过region_mask函数得到的布尔索引,用于筛选出位于指定区域内的数据。reshape方法中第一个参数是新的shape,这里是(nscan*nray, 1),表示将数据变成nscan*nray行,1列的形状。注意reshape方法返回的是一个新的数组,不会改变原始数组的值。
相关问题
import xarray as xr import matplotlib.pyplot as plt from netCDF4 import Dataset import cartopy.crs as ccrs#投影方式 import cartopy.feature as cfeature import cartopy.io.shapereader as shpreader import numpy as np import pandas as pd from matplotlib.font_manager import fontManager da=pd.read_csv(r'E:\python11\STATION_58237.txt',sep='\s+') print(da) tem=da['TEM'] #print(tem.shape) rhu=da['RHU'] tem_ave=[] for i in range(0,24): tem_data=tem[i:147:24] print(tem_data) tem_ave[i]=np.mean(tem_data) print(tem_ave) plt.plot(tem_ave)帮我改一下
import xarray as xr
import matplotlib.pyplot as plt
from netCDF4 import Dataset
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import cartopy.io.shapereader as shpreader
import numpy as np
import pandas as pd
from matplotlib.font_manager import fontManager
da = pd.read_csv(r'E:\python11\STATION_58237.txt', sep='\s+')
print(da)
tem = da['TEM']
rhu = da['RHU']
tem_ave = []
for i in range(0, 24):
tem_data = tem[i:147:24]
print(tem_data)
tem_ave.append(np.mean(tem_data)) # 将结果添加到列表中
print(tem_ave)
plt.plot(tem_ave)
plt.show() # 显示图形
import xarray as xr import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs def readdat(pth,var): ds = xr.open_dataset(pth) dat = ds[var].values lon=ds['lon'] lat=ds['lat'] # 只读取每年1月的数据 dat = dat.sel(time=dat['time.month'].isin([1])) dat = dat.loc['1981-01-01':'2018-12-01','500',:,:] return lon,lat,dat AttributeError: 'numpy.ndarray' object has no attribute 'sel'
这个错误提示是因为你在一个 `numpy.ndarray` 上使用了 `.sel()` 这个 xarray.Dataset 特有的方法。你需要将 `dat` 变量转换成 xarray 的 Dataset 或者 DataArray 类型才能使用 `.sel()` 方法。
你可以尝试将以下代码:
```
dat = dat.sel(time=dat['time.month'].isin([1]))
dat = dat.loc['1981-01-01':'2018-12-01','500',:,:]
```
改成:
```
dat = xr.DataArray(dat, coords=[ds['time'], ds['level'], ds['lat'], ds['lon']], dims=['time', 'level', 'lat', 'lon'])
dat = dat.sel(time=dat['time.month'].isin([1]))
dat = dat.loc['1981-01-01':'2018-12-01', 500, :, :]
```
这样就可以使用 `.sel()` 方法来选择数据了。
阅读全文
相关推荐















