2016-09-07 3 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.

Затем я заставил tuple в list путем изменения us_lat и us_lon иметь list(n.ravel(n.where(...)), но она по-прежнему возвращает ту же ошибку. Раньше я мог индексировать этот путь, и я не совсем уверен, почему он не работает на этот раз.

ответ

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 lat x lon). Таким образом, вам необходимо изменить чтение этой переменной, чтобы включить все три измерения:

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

К сожалению, с этими изменениями оно по-прежнему возвращает такое же сообщение об ошибке. Я также пробовал его без использования ravel или функции списка, но ни одна из них не работала. Другие попытки, которые я попытался, выглядят следующим образом: 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

После исправления ошибки, где в коде возвращается тип

Смежные вопросы