我想从netCDF
文件中提取指定的纬度和经度。过去,我从未遇到过提取数据的问题。我假设这次不工作的原因是因为我以不同的方式阅读我的数据(见下文)
data = netCDF4.Dataset('/home/eburrows/metr173/regional_cm/Lab1/air.mon.mean.nc', mode = 'r')
lat = data.variables['lat'][:] #90 through -90
lon = data.variables['lon'][:] #0 through 360
air_temp = data.variables['air'][:] #degrees C
air_temp[air_temp>10000] = n.NaN
以前我能够做到以下几点:
us_lat = n.ravel(n.where((lat>=___)&(lat<=___)))
us_lon = n.ravel(n.where((lon>=___)&(lon<=___)))
us_annual_temp = n.nanmean(air_temp[:,us_lat, us_lon],0)
但是,这次它返回Type Error
,表示list indices must be integers, not tuple
。
然后我通过将tuple
和list
更改为us_lat
将us_lon
强制转换为list(n.ravel(n.where(...))
,但它仍会返回相同的错误。在过去,我已经能够以这种方式编制索引,并且不完全确定这次为什么它不起作用。
答案 0 :(得分:0)
来自lat_us
命令的where
的结果是索引的元组,而不是切片air_temp
所需的实际索引。要解决此问题,您需要将lat_us
的第一个结果编入索引以访问纬度索引数组。
例如,
>>> import numpy as np
>>> lat = np.arange(-90,91,10)
>>> lat
array([-90, -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30,
40, 50, 60, 70, 80, 90])
>>> lat_us = np.where((lat >= -30) & (lat <= 30))
>>> lat_us
(array([ 6, 7, 8, 9, 10, 11, 12]),)
>>> lat_us[0]
array([ 6, 7, 8, 9, 10, 11, 12])
所以行
us_lat = n.ravel(n.where((lat>=___)&(lat<=___)))
应修改为(注意:我认为你不需要对此进行调整):
us_lat = n.where((lat>=___) & (lat<=___))[0]
此外,您目前只读取变量air_temp
的一维,但它似乎是3D(时间x纬度x lon)。因此,您需要修改此变量的读入以包含所有三个维度:
air_temp = data.variables['air'][:,:,:]