2016-09-07 34 views
0

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

然後我通過改變us_latus_lonlist(n.ravel(n.where(...))迫使tuplelist,但它仍然會返回相同的錯誤。在過去,我可以通過這種方式進行索引,但我不完全確定爲什麼這次不工作。

回答

0

來自where命令的lat_us的結果是索引的元組,而不是切片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 lat x lon)。因此,您需要修改此變量的讀入以包含所有三個維度:

air_temp = data.variables['air'][:,:,:] 
+0

不幸的是,對於這些修改,它仍然返回相同的錯誤消息。我也試過了,沒有使用ravel或list函數,但兩個選項都不起作用。我嘗試過的其他嘗試如下所示:us_lat = list(n.ravel(n.where((lat> = ____)&(lat <= ___))[0]))或us_lat = n.ravel(n.where ((lat> = ____)&(lat <= ___))[0]) –

+0

'lat_us'和'lon_us'的結果是什麼?他們應該是一系列指數。你可以用'type(lat_us)'來檢查它,它應該返回'' – N1B4

+0

修復了代碼中的錯誤之後,類型返回