Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python netCDF网格文件:使用2D值从1D数组提取信息_Python_Python 3.x_Maps_Netcdf - Fatal编程技术网

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

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 #---------------------

我尝试在Python3中使用地形/测深信息,基本上是一个包含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_经典

根组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)