NETCDF网格文件:使用2D值从1D数组中提取信息



我试图在Python 3中使用地形/测深的信息(基本上是一个包含X [十位数的经度)的网格,y [小数点]和z [米] [米])。

网格文件具有扩展名.NC,因此是NetCDF文件。通常,我会将其用于映射诸如通用映射工具之类的映射工具中,而不必费心NetCDF文件的工作原理,但是我需要在Python脚本中提取特定信息。现在,这仅将数据集限制在某些经度/纬度范围内。

但是,现在我对特定x和y值的z信息有些丢失。这是我到目前为止对数据的了解

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_classic

print(fh)

根组(NetCDF3_Classic数据模型,文件格式NETCDF3): 标题:GEBCO_08网格 资料来源:20100927 尺寸(尺寸):侧(2),xysize(933120000) 变量(尺寸):float64 x_range(侧),float64 y_range(侧),int16 z_range(侧),float64间距(侧),int32 dimension(侧),int16 z(xysize)(xysize) 组:

print(fh.dimensions.keys()) 

odict_keys(['side','xysize'])

print(fh.dimensions['side'])

:name ='side',size = 2

print(fh.dimensions['xysize'])

:name ='xysize',size = 933120000

#----------------------
# Variables
#----------------------
print(fh.variables.keys()) # returns all available variable keys

odict_keys(['x_range','y_range','z_range','spacing','dimension','z'])

xrange = fh.variables['x_range'][:] 
print(xrange)

[-180。180.]#包含全世界经度的值-180至180

yrange = fh.variables['y_range'][:]
print(yrange) 

[-90。90.]#包含整个世界纬度的值-90至90

zrange = fh.variables['z_range'][:]

[-10977 8685]#包含世界深度/地形范围

spacing = fh.variables['spacing'][:] 

[0.00833333 0.00833333]#x和y中的间距。等于尺寸,如果乘以x和y范围

dimension = fh.variables['dimension'][:] 

[43200 21600]#与z的形状相对应,如果是我希望的2D数组(目前是9333120000的1D数组 - 它是43200*21600)

z = fh.variables['z'][:] # currently an 1D array of the depth/topography/z information I want
fh.close

基于此信息,我仍然不知道如何访问z以获取特定的x/y(经度/纬度)值。我认为基本上我需要将z的1D数组转换为对应于经度/纬度值的2D数组。我只是不知道如何做到这一点。我在一些帖子中看到了人们试图将1D转换为2D阵列的帖子,但是我无法知道他们在世界的哪个角落以及他们的进步方式。

我知道有一个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] 

请注意,您输入的lat/lon/depth的数字是该维度的 index ,而不是实际的纬度。您需要先确定要事先寻找的值的索引。

我刚刚在这篇文章中找到了解决方案。抱歉,我以前没看到。这就是我的代码现在的样子。多亏了戴夫(他在上面的帖子中回答了自己的问题)。我唯一要处理的是尺寸必须保持整数。

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的形状(以下代码)时,前者是一个1D阵列,长度为933120000,后者是2D阵列,尺寸为43200x21600。

print(zz.shape)
print(bathy.shape)

下一步是使用索引正确地访问测深/地形数据,就像N1B4在他的职位

中所述

最新更新