将高分辨率网格化数据重新网格化为低分辨率较粗分辨率数据?
Regridding high resolution gridded data to low resolution coarser resolution data?
我有一个 netcdf 文件,其中包含高分辨率网格数据 (.1 x .1 deg) 并使用 matplotlib 在底图上绘图。我想做的情节是等高线。出于特定原因,我想以 1 x 1 度分辨率的间隔绘制数据。为此,我使用了此处 Regridding regular netcdf data.
中的以下代码示例
查看 link 实际数据的更新 1。
为了清楚起见,以下是我尝试执行以重新网格化以降低分辨率的代码:-
from mpl_toolkits import basemap
from netCDF4 import Dataset
filename = 'path/to/netcdf/file.nc'
with Dataset(filename, mode='r') as fh:
lons = fh.variables['LON'][:]
lats = fh.variables['LAT'][:]
data = fh.variables['Data'][:].squeeze()
lons_sub, lats_sub = np.meshgrid(lons[::4], lats[::4], sparse=True)
data_coarse = basemap.interp(data, lons, lats, lons_sub, lats_sub, order=1)
代码似乎是正确的。但是当我执行代码时,我在行 data_coarse = basemap.interp(data, lons, lats, lons_sub, lats_sub, order=3)
:-
中收到以下错误
/__init__.py", line 4897, in interp
if xin[-1]-xin[0] < 0 or yin[-1]-yin[0] < 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
一直没搞明白问题出在哪里,如何解决?
感谢任何帮助。
更新 1
link到实际数据https://www.dropbox.com/s/ddlpbw5vvj5kz5w/mslp.txt?dl=0
link 到纬度 https://www.dropbox.com/s/lpwjavxtwtt3r13/xlat.txt?dl=0
和 link 到 lons https://www.dropbox.com/s/1a0q49drfcd2o9h/xlon.txt?dl=0
在您的代码段中,xin = lons
和 yin = lats
。来自 basemap.interp
文档,
xin, yin: rank-1 arrays containing x and y of datain grid in increasing order.
意味着xin
(lons
)和yin
(lats
)必须不断增加。从您的错误回溯来看,情况似乎并非如此,因为 xin[-1]-xin[0] < 0
and/or yin[-1]-yin[0] < 0
.
不知道 lons
或 lats
到底是什么(因为您的代码不会 运行 包含您 link 的数据),很难详细说明进一步。
编辑 - 用底图绘图
我认为您 运行 遇到的主要问题是纬度和经度数据的形状。由于 lons
和 lats
本质上是相同数组的堆栈,我将它们都转换为一维数组,如下所示。
import numpy as np
from mpl_toolkits import basemap
import matplotlib.pyplot as plt
# load data
data = np.loadtxt('mslp.txt', delimiter=',')
lons = np.loadtxt('xlon.txt', delimiter=',')
lats = np.loadtxt('xlat.txt', delimiter=',')
# take 1 dimensional slice of lons and lats
longitude = lons[0] # array([31.1, 31.4, 31.7,...,119.1, 119.3, 119.6])
latitude = lats[:,0] # array([-2.3, -2.1, -1.8,...,39.4, 39.6, 39.8])
# subdivide longitude and latitude into ~1deg grid data
lons_sub, lats_sub = np.meshgrid(longitude[::4], latitude[::4])
# implement basemap.interp to interpolate along ~1deg grid data
data_course = basemap.interp(datain=data, xin=longitude, yin=latitude,
xout=lons_sub, yout=lats_sub, order=3)
m = basemap.Basemap(llcrnrlon=longitude[0], llcrnrlat=latitude[0],
urcrnrlon=longitude[-1], urcrnrlat=latitude[-1],
projection='merc', resolution='c')
fig = plt.figure()
# ax1 -- contour plot of resampled data
ax1 = fig.add_subplot(211)
m.contour(lons_sub, lats_sub, data_course, linewidths=2.5, latlon=True)
m.fillcontinents(color=[0.7, 0.9, 0.8], lake_color=[0.3, 0.7, 0.9])
m.drawmapboundary(fill_color=[0.3, 0.7, 0.9])
m.drawcoastlines()
# ax2 -- imshow plot of resampled data
ax2 = fig.add_subplot(212)
m.drawcoastlines()
m.imshow(data_course, interpolation='nearest',
extent=[lons_sub[0], lons_sub[-1], lats[0], lats[-1]])
我有一个 netcdf 文件,其中包含高分辨率网格数据 (.1 x .1 deg) 并使用 matplotlib 在底图上绘图。我想做的情节是等高线。出于特定原因,我想以 1 x 1 度分辨率的间隔绘制数据。为此,我使用了此处 Regridding regular netcdf data.
中的以下代码示例查看 link 实际数据的更新 1。
为了清楚起见,以下是我尝试执行以重新网格化以降低分辨率的代码:-
from mpl_toolkits import basemap
from netCDF4 import Dataset
filename = 'path/to/netcdf/file.nc'
with Dataset(filename, mode='r') as fh:
lons = fh.variables['LON'][:]
lats = fh.variables['LAT'][:]
data = fh.variables['Data'][:].squeeze()
lons_sub, lats_sub = np.meshgrid(lons[::4], lats[::4], sparse=True)
data_coarse = basemap.interp(data, lons, lats, lons_sub, lats_sub, order=1)
代码似乎是正确的。但是当我执行代码时,我在行 data_coarse = basemap.interp(data, lons, lats, lons_sub, lats_sub, order=3)
:-
/__init__.py", line 4897, in interp
if xin[-1]-xin[0] < 0 or yin[-1]-yin[0] < 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
一直没搞明白问题出在哪里,如何解决?
感谢任何帮助。
更新 1
link到实际数据https://www.dropbox.com/s/ddlpbw5vvj5kz5w/mslp.txt?dl=0
link 到纬度 https://www.dropbox.com/s/lpwjavxtwtt3r13/xlat.txt?dl=0
和 link 到 lons https://www.dropbox.com/s/1a0q49drfcd2o9h/xlon.txt?dl=0
在您的代码段中,xin = lons
和 yin = lats
。来自 basemap.interp
文档,
xin, yin: rank-1 arrays containing x and y of datain grid in increasing order.
意味着xin
(lons
)和yin
(lats
)必须不断增加。从您的错误回溯来看,情况似乎并非如此,因为 xin[-1]-xin[0] < 0
and/or yin[-1]-yin[0] < 0
.
不知道 lons
或 lats
到底是什么(因为您的代码不会 运行 包含您 link 的数据),很难详细说明进一步。
编辑 - 用底图绘图
我认为您 运行 遇到的主要问题是纬度和经度数据的形状。由于 lons
和 lats
本质上是相同数组的堆栈,我将它们都转换为一维数组,如下所示。
import numpy as np
from mpl_toolkits import basemap
import matplotlib.pyplot as plt
# load data
data = np.loadtxt('mslp.txt', delimiter=',')
lons = np.loadtxt('xlon.txt', delimiter=',')
lats = np.loadtxt('xlat.txt', delimiter=',')
# take 1 dimensional slice of lons and lats
longitude = lons[0] # array([31.1, 31.4, 31.7,...,119.1, 119.3, 119.6])
latitude = lats[:,0] # array([-2.3, -2.1, -1.8,...,39.4, 39.6, 39.8])
# subdivide longitude and latitude into ~1deg grid data
lons_sub, lats_sub = np.meshgrid(longitude[::4], latitude[::4])
# implement basemap.interp to interpolate along ~1deg grid data
data_course = basemap.interp(datain=data, xin=longitude, yin=latitude,
xout=lons_sub, yout=lats_sub, order=3)
m = basemap.Basemap(llcrnrlon=longitude[0], llcrnrlat=latitude[0],
urcrnrlon=longitude[-1], urcrnrlat=latitude[-1],
projection='merc', resolution='c')
fig = plt.figure()
# ax1 -- contour plot of resampled data
ax1 = fig.add_subplot(211)
m.contour(lons_sub, lats_sub, data_course, linewidths=2.5, latlon=True)
m.fillcontinents(color=[0.7, 0.9, 0.8], lake_color=[0.3, 0.7, 0.9])
m.drawmapboundary(fill_color=[0.3, 0.7, 0.9])
m.drawcoastlines()
# ax2 -- imshow plot of resampled data
ax2 = fig.add_subplot(212)
m.drawcoastlines()
m.imshow(data_course, interpolation='nearest',
extent=[lons_sub[0], lons_sub[-1], lats[0], lats[-1]])