Python 将高分辨率网格数据重新填充为低分辨率粗分辨率数据?

Python 将高分辨率网格数据重新填充为低分辨率粗分辨率数据?,python,matplotlib,netcdf,Python,Matplotlib,Netcdf,我有一个netcdf文件,其中包含高分辨率网格数据(.1 x.1 deg),并使用matplotlib在底图上绘制。我想画的是等高线。出于特定原因,我希望以1 x 1度的分辨率绘制数据。为此,我使用了下面的代码示例 有关实际数据的链接,请参见更新1 为了清晰起见,以下是我试图执行的代码,用于重新填充到较低的分辨率:- from mpl_toolkits import basemap from netCDF4 import Dataset filename = 'path/to/netcdf/f

我有一个netcdf文件,其中包含高分辨率网格数据(.1 x.1 deg),并使用matplotlib在底图上绘制。我想画的是等高线。出于特定原因,我希望以1 x 1度的分辨率绘制数据。为此,我使用了下面的代码示例

有关实际数据的链接,请参见更新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\u rough=basemap.interp(data,lons,lats,lons\u sub,lats\u sub,order=3)行中得到以下错误:-

/\uuuu init\uuuu.py”,第4897行,在interp中
如果xin[-1]-xin[0]<0或yin[-1]-yin[0]<0:
ValueError:包含多个元素的数组的真值不明确。请使用a.any()或a.all()
我不明白问题在哪里,如何解决

感谢您的帮助

更新1

链接到实际数据

链接到lats


以及在您的代码片段中指向lons的链接,
xin=lons
yin=lats

xin,yin:在网格中按递增顺序包含数据的x和y的秩1数组

意思
xin
lons
)和
yin
lats
)必须不断增加。从错误回溯来看,情况似乎不是这样,因为
xin[-1]-xin[0]<0
和/或
yin[-1]-yin[0]<0

如果不知道什么是
lon
lat
(因为您的代码没有使用链接到的数据运行),就很难进一步详细说明

编辑-使用底图打印 我认为您遇到的主要问题是纬度和经度数据的形状。由于
lons
lats
基本上是相同数组的堆栈,因此我将它们都转换为1d数组,如下所示

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]])

在您的代码片段中,
xin=lons
yin=lats

xin,yin:在网格中按递增顺序包含数据的x和y的秩1数组

意思
xin
lons
)和
yin
lats
)必须不断增加。从错误回溯来看,情况似乎不是这样,因为
xin[-1]-xin[0]<0
和/或
yin[-1]-yin[0]<0

如果不知道什么是
lon
lat
(因为您的代码没有使用链接到的数据运行),就很难进一步详细说明

编辑-使用底图打印 我认为您遇到的主要问题是纬度和经度数据的形状。由于
lons
lats
基本上是相同数组的堆栈,因此我将它们都转换为1d数组,如下所示

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
专家,但我不知道你提供的代码如何与你上传的纯文本文件一起运行。你可以用这个
data=np.loadtxt('mslp.txt',delimiter=','))以numpy数组的形式读取数据。
当然可以,但
数据的形状是(189309)我不清楚什么是
lons
lats
应该是什么。我不是
netcdf
专家,但我不知道你提供的代码如何与你上传的纯文本文件一起运行。你可以用这个
data=np.loadtxt('mslp.txt',delimiter=',')作为numpy数组读取数据
。当然可以,但是
数据的形状是(189309)我不清楚什么是
lons
lats
应该是什么。我已经用数据链接更新了答案,lats和lons。感谢您上传数据,通过使用它,我认为我能够找到您问题的根源。希望我更新的答案有意义,并且是您在解决方案中寻找的答案。感谢代码。当我尝试在底图中绘制上述代码时,它运行时没有错误,但没有可见的等高线。你能在底图上绘制相同的代码而不是子图吗?它正常工作了。但当我使其更粗糙或更密集时,分辨率不会改变。我认为这是将2d阵列转换为1d阵列(lats和lons)的问题。抱歉,我没有相同的问题。要更改分辨率,请将
[::4]
更改为
[::6]
[::10]
例如,是吗?我已经用数据、lats和lons的链接更新了答案。感谢您上传数据,通过使用它,我想我能够找到您问题的根源。希望我更新的答案有意义,并且是您在解决方案中寻找的。感谢代码。当我尝试在底图中绘制上述代码时,它会运行wit没有错误,但没有可见的等高线。你能在底图上绘制相同的等高线,而不是子图吗?成功了。但分辨率在我使其更粗糙或更密集时不会改变。我认为这是将2d阵列转换为1d阵列(LAT和LON)的问题。抱歉,但我没有相同的问题。要更改分辨率,请更改
[::4]
[::6]
[::10]
例如,是吗?