【问题标题】:Regridding high resolution gridded data to low resolution coarser resolution data?将高分辨率网格数据重新网格化为低分辨率粗分辨率数据?
【发布时间】:2016-09-10 10:42:36
【问题描述】:

我有一个带有高分辨率网格数据 (.1 x .1 度) 的 netcdf 文件,并使用 matplotlib 在底图上绘图。我想做的情节是等高线。出于特定原因,我想以 1 x 1 度分辨率的间隔绘制数据。为此,我使用了来自此处Regridding regular netcdf data 的以下代码示例。

有关实际数据的链接,请参阅更新 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

链接到实际数据https://www.dropbox.com/s/ddlpbw5vvj5kz5w/mslp.txt?dl=0

链接到 lats https://www.dropbox.com/s/lpwjavxtwtt3r13/xlat.txt?dl=0

还有链接到 lons https://www.dropbox.com/s/1a0q49drfcd2o9h/xlon.txt?dl=0

【问题讨论】:

  • 我不是netcdf 专家,但我不明白您提供的代码如何与您上传的纯文本文件一起运行。
  • 你可以用这个data = np.loadtxt('mslp.txt',delimiter=',')将数据读取为numpy数组。
  • 当然可以,但是data 的形状是(189, 309),我不清楚lonslats 应该是什么。

标签: python matplotlib netcdf


【解决方案1】:

在您的代码 sn-p 中,xin = lonsyin = lats。来自basemap.interp 文档,

xin, yin: rank-1 数组,包含网格中数据 x 和 y 的递增顺序。

意思是xin (lons) 和yin (lats) 必须不断增加。从您的错误回溯来看,情况似乎并非如此,因为xin[-1]-xin[0] &lt; 0 和/或yin[-1]-yin[0] &lt; 0

在不知道 lonslats 到底是什么的情况下(因为您的代码没有使用您链接到的数据运行),很难进一步阐述。

编辑 - 使用底图绘图

我认为您遇到的主要问题是纬度和经度数据的形状。由于lonslats 本质上是相同数组的堆栈,因此我将它们都转换为一维数组,如下所示。

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

【讨论】:

  • 我已经用数据、经纬度的链接更新了答案。
  • 感谢您上传您的数据,通过使用它我想我能够找到您问题的根源。希望我更新的答案是有意义的,并且是您在解决方案中寻找的。​​span>
  • 感谢您的代码。当我尝试在底图中绘制上述代码时,它运行时没有错误,但看不到等高线。你可以在底图而不是子图上绘制相同的图吗?
  • 搞定了。但是当我把它变得更粗糙或更密集时,分辨率并没有改变。我认为这是将 2d 转换为 1d 数组(纬度和经度)的问题。
  • 抱歉,我没有同样的问题。例如,要更改您将[::4] 更改为[::6][::10] 的分辨率,是吗?
猜你喜欢
  • 2012-09-26
  • 2021-05-16
  • 1970-01-01
  • 2018-10-03
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多