4
\ begingroup美元

我正在尝试从ETOPO1数据中选择地中海的一个区域。

#从netCDF4导入数据集data = Dataset("ETOPO1_Bed_g_gdal.grd",'r') print(data.variables.keys()) #获取数据lon_range = data。变量['x_range'][:] lat_range = data。变量['y_range'][:] topo_range = data。Variables ['z_range'][:] spacing = data。变量['spacing'][:] dimension = data。变量['dimension'][:] z = data。变量['z'][:] lon_num =维度[0]lat_num =维度[1]#准备数组lon_input = np.zero (lon_num);lat_input = np.zero (lat_num) for i in range(lon_num): lon_input[i] = lon_range[0] + i * spacing[0] for i in range(lat_num): lat_input[i] = lat_range[0] + i * spacing[1] #创建2D数组lon, lat = np。meshgrid(lon_input, lat_input) #将2D数组从1D数组转换为z值topo = np。重塑(z, (lat_num, lon_num)) #选择区域lon_idx_min = np.abs(lon_input-12.6).argmin() lon_idx_max = np.abs(lon_input-13.4).argmin() lat_idx_min = np.abs(lat_input-43.8).argmin() lat_idx_max = np.abs(lat_input-44.2).argmin() #获取数据topo[lon_idx_min:lon_idx_max, lat_idx_min:lat_idx_max].data

这将返回一个空数组:

>>array([], shape=(0, 24), dtype=float64)

一个主要问题是:

我做错了什么?当我检查我切片的lat值(lat_input[lat_idx_max]等)时,它们是有意义的。然而,lon_idx_max和lon_idx_min高于len(topo)(11556和11604 vs 10801)。我想这就是问题所在,但我找不到原因。

一个额外的问题:

为什么如果我打开开关,然后我得到一些数据?请注意,数据没有意义(亚得里亚海-4000米…)

\ endgroup美元
2
  • \ begingroup美元 嗨,x_range是从哪里来的,因为当我试图重建你的例子时,python不知道它是什么 \ endgroup美元
    - - - - - -维斯
    2022年6月22日10:46
  • \ begingroup美元 当我打印nc文件的变量时,它沿着y_range和z_range存在 \ endgroup美元
    - - - - - -shamalaia
    2022年6月22日23:28

1回答1

5
+ 50
\ begingroup美元

看起来你只是把纬度的最小值和最大值的顺序搞混了。你看错地方了(-44°而不是+44°)

#导入numpy作为np导入matplotlib。pyplot as plt from netCDF4 import Dataset data = Dataset("ETOPO1_Bed_g_gmt4.grd",'r') lon_range = data。变量['x_range'][:] lat_range = data。变量['y_range'][:] topo_range = data。Variables ['z_range'][:] spacing = data。变量['spacing'][:] dimension = data。变量['dimension'][:] z = data。变量['z'][:] lon_num =维数[0]lat_num =维数[1]lon = np.linspace(lon_range[0],lon_range[1],维数[0])lat = np.linspace(lat_range[0],lat_range[1],维数[1])topo = np。#选择区域lon_idx_min = np.abs(lon-10).argmin() #我增加了一点边距lon_idx_max = np.abs(lon-20).argmin() #以便更好地查看区域的位置lat_idx_min = np.abs(lat+48).argmin() lat_idx_max = np.abs(lat+40).argmin() plt。Imshow (topo[lat_idx_min:lat_idx_max, lon_idx_min:lon_idx_max], vmax=0)

通过使用np。在Linspace中,您可以从代码中删除循环,并大大提高其速度。没有必要从纬度和纬度创建网格。

\ endgroup美元
1
  • \ begingroup美元 尊敬的气象学家 \ endgroup美元
    - - - - - -Joscha Fregin
    2022年6月15日10:44

你的答案

点击“发表您的答案”,即表示您同意我们的服务条款隐私政策饼干的政策

不是你想要的答案吗?浏览其他有标签的问题问自己的问题