提取指定纬度和经度时的索引问题

时间:2016-09-07 06:48:33

标签: python list indexing tuples typeerror

我想从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

然后我通过将tuplelist更改为us_latus_lon强制转换为list(n.ravel(n.where(...)),但它仍会返回相同的错误。在过去,我已经能够以这种方式编制索引,并且不完全确定这次为什么它不起作用。

1 个答案:

答案 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'][:,:,:]