Python netCDF网格文件:使用2D值从1D数组提取信息
我尝试在Python3中使用地形/测深信息,基本上是一个包含x[十进制经度]、y[十进制纬度]和z[米]的网格 网格文件的扩展名为.nc,因此是一个netCDF文件。通常,我会在映射工具(如通用映射工具)中使用它,而不必担心netCDF文件如何工作,但我需要在Python脚本中提取特定信息。目前,这只是将数据集限制在某些经度/纬度范围内 然而,现在我对如何获取特定x和y值的z信息有点迷茫。以下是我到目前为止对数据的了解Python netCDF网格文件:使用2D值从1D数组提取信息,python,python-3.x,maps,netcdf,Python,Python 3.x,Maps,Netcdf,我尝试在Python3中使用地形/测深信息,基本上是一个包含x[十进制经度]、y[十进制纬度]和z[米]的网格 网格文件的扩展名为.nc,因此是一个netCDF文件。通常,我会在映射工具(如通用映射工具)中使用它,而不必担心netCDF文件如何工作,但我需要在Python脚本中提取特定信息。目前,这只是将数据集限制在某些经度/纬度范围内 然而,现在我对如何获取特定x和y值的z信息有点迷茫。以下是我到目前为止对数据的了解 import netCDF4 #---------------------
import netCDF4
#----------------------
# Load netCDF file
#----------------------
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc'
fh = netCDF4.Dataset(bathymetry_file, mode='r')
#----------------------
# Getting information about the file
#----------------------
print(fh.file_format)
NETCDF3_经典
根组NETCDF3\u经典数据模型,文件格式NETCDF3:
标题:GEBCO_08电网
资料来源:20100927
尺寸尺寸:侧面2,XYSIZE93312000
可变尺寸:浮点64 x_范围边、浮点64 y_范围边、int16 z_范围边、浮点64间距边、int32尺寸边、int16 zxysize
小组:
odict_键['side','xysize']
:name=‘side’,size=2
:name='xysize',size=93312000
odict_键['x_范围'、'y_范围'、'z_范围'、'间距'、'尺寸'、'z']
[-180.180.]包含整个世界的经度值-180到180
[-90.90.]包含全世界纬度的-90到90的值
[-10977 8685]包含世界的深度/地形范围
[0.00833333 0.00833333]x和y方向的间距。如果乘以x和y范围,则等于尺寸
[43200 21600]对应于z的形状,如果它是我希望的2D数组,那么它当前是一个933312000的1D数组,即43200*21600
基于这些信息,我仍然不知道如何访问特定x/y经度/纬度值的z。我认为基本上我需要将z的一维数组转换成对应于经度/纬度值的二维数组。我只是不知道该怎么做。我在一些帖子中看到,人们试图将一维数组转换为二维数组,但我无法知道它们是从世界的哪个角落开始的,它们是如何发展的
我知道有一个3岁的孩子,但是,我不知道如何为我的问题找到扁平阵列的模拟索引,或者如何准确地处理它。有人能帮忙吗?您需要首先读取z的三个维度lat、lon和depth,然后提取每个维度的值。这里有几个例子
# Read in all 3 dimensions [lat x lon x depth]
z = fh.variables['z'][:,:,:]
# Topography at a single lat/lon/depth (1 value):
z_1 = z[5,5,5]
# Topography at all depths for a single lat/lon (1D array):
z_2 = z[5,5,:]
# Topography at all latitudes and longitudes for a single depth (2D array):
z_3 = z[:,:,5]
请注意,为纬度/经度/深度输入的数字是该维度中的索引,例如,不是实际纬度。您需要事先确定要查找的值的索引。我刚刚在中找到了解决方案。对不起,我以前没看到。下面是我的代码现在的样子。多亏了戴夫,他在上面的帖子中回答了自己的问题。我要做的唯一一件事就是维度必须保持整数
import netCDF4
import numpy as np
#----------------------
# Load netCDF file
#----------------------
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc'
fh = netCDF4.Dataset(bathymetry_file, mode='r')
#----------------------
# Extract variables
#----------------------
xrange = fh.variables['x_range'][:]
yrange = fh.variables['y_range'][:]
zz = fh.variables['z'][:]
fh.close()
#----------------------
# Compute Lat/Lon
#----------------------
nx = (xrange[-1]-xrange[0])/spacing[0] # num pts in x-dir
ny = (yrange[-1]-yrange[0])/spacing[1] # num pts in y-dir
nx = nx.astype(np.integer)
ny = ny.astype(np.integer)
lon = np.linspace(xrange[0],xrange[-1],nx)
lat = np.linspace(yrange[0],yrange[-1],ny)
#----------------------
# Reshape the 1D to an 2D array
#----------------------
bathy = zz[:].reshape(ny, nx)
现在,当我看zz和bathy下面代码的形状时,前者是长度为93312000的一维数组,后者是尺寸为43200x21600的二维数组
print(zz.shape)
print(bathy.shape)
下一步是使用索引正确访问测深/地形数据,正如N1B4在他的文章中所述不幸的是,Lat和Long都不能直接读取,唯一具有两个以上值的变量是z,1D arrayI尝试了一下,只是为了确定,我得到了错误值error:slicing表达式超出了变量的维数。
print(fh.dimensions['xysize'])
#----------------------
# Variables
#----------------------
print(fh.variables.keys()) # returns all available variable keys
xrange = fh.variables['x_range'][:]
print(xrange)
yrange = fh.variables['y_range'][:]
print(yrange)
zrange = fh.variables['z_range'][:]
spacing = fh.variables['spacing'][:]
dimension = fh.variables['dimension'][:]
z = fh.variables['z'][:] # currently an 1D array of the depth/topography/z information I want
fh.close
# Read in all 3 dimensions [lat x lon x depth]
z = fh.variables['z'][:,:,:]
# Topography at a single lat/lon/depth (1 value):
z_1 = z[5,5,5]
# Topography at all depths for a single lat/lon (1D array):
z_2 = z[5,5,:]
# Topography at all latitudes and longitudes for a single depth (2D array):
z_3 = z[:,:,5]
import netCDF4
import numpy as np
#----------------------
# Load netCDF file
#----------------------
bathymetry_file = 'C:/Users/te279/Matlab/data/gebco_08.nc'
fh = netCDF4.Dataset(bathymetry_file, mode='r')
#----------------------
# Extract variables
#----------------------
xrange = fh.variables['x_range'][:]
yrange = fh.variables['y_range'][:]
zz = fh.variables['z'][:]
fh.close()
#----------------------
# Compute Lat/Lon
#----------------------
nx = (xrange[-1]-xrange[0])/spacing[0] # num pts in x-dir
ny = (yrange[-1]-yrange[0])/spacing[1] # num pts in y-dir
nx = nx.astype(np.integer)
ny = ny.astype(np.integer)
lon = np.linspace(xrange[0],xrange[-1],nx)
lat = np.linspace(yrange[0],yrange[-1],ny)
#----------------------
# Reshape the 1D to an 2D array
#----------------------
bathy = zz[:].reshape(ny, nx)
print(zz.shape)
print(bathy.shape)