2013-09-11 3 views
1

Это следующий вопрос, связанный с this question.Эффективный анализ netCDF при прохождении через данные

Благодаря предыдущей помощи я успешно импортировал файл netCDF (или файлы с MFDataset) и умею сравнивать разные времена друг с другом, чтобы создать другой совокупный набор данных. Вот фрагмент текущего кода.

from numpy import * 
import netCDF4 
import os 

f = netCDF4.MFDataset('air.2m.1979.nc') 

atemp = f.variables['air'] 

ntimes, ny, nx = atemp.shape 
cold_days = zeros((ntimes, ny, nx), dtype=int) 

for i in range(ntimes): 
    for b in range(ny): 
    for c in range(nx): 
     if i == 1: 
      if atemp[i,b,c] < 0: 
      cold_days[i,b,c] = 1 
      else: 
      cold_days[i,b,c] = 0 
     else: 
     if atemp[i,b,c] < 0: 
      cold_days[i,b,c] = cold_days[i-1,b,c] + 1 
     else: 
      cold_days[i,b,c] = 0 

Это похоже на грубую силу, чтобы выполнить эту работу, и хотя она работает, требуется очень много времени. Я не уверен, что это занимает много времени, потому что я имею дело с 365 349x277 матрицами (35,285,645 пикселей), или если моя старая школьная грубая сила просто медленная по сравнению с некоторыми встроенными методами python.

Ниже приведен пример того, что я считаю кодом. Он смотрит на Время и увеличивает холодные дни, если temp < 0. Если temp> = 0, чем холодные дни, сбрасывается до 0. На следующем изображении вы увидите, что ячейка в строке 2, колонка 1, увеличивает каждое время, которое проходит, но ячейка на строка 2, приращение столбца 2 в момент 1, но сбрасывается до нуля во время 2.

Есть ли более эффективный способ перекопать этот набор данных netCDF для выполнения этого типа операции? Here is an example image

+0

Почему вы решили перевернуть x и y? Ответ http://stackoverflow.com/questions/18665078/loop-through-netcdf-files-and-run-calculations-python-or-r не пересекает x и y и будет намного быстрее. –

+0

для i в xrange (ntimes): cold_days + = atemp [i,:,:]. Data-273.15 <0 предоставил единый кадр во временной матрице с кумулятивными холодными днями в течение года. Он не сравнивался с предыдущими временными рамками и соответствующим образом регулировал. Я попытаюсь заменить x и y на: – mkmitchell

+0

Я получаю сообщение об ошибке. Я также пробовал данные atemp [i,:,:]. if atemp [i,:,:] <273.15: ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте a.any() или a.all() – mkmitchell

ответ

0

Похоже, что это незначительная модификация - просто напишите данные на каждом шаге. Что-то близко к этому должно работать:

from pylab import * 
import netCDF4 

# open NetCDF input files 

f = netCDF4.MFDataset('/usgs/data2/rsignell/models/ncep/narr/air.2m.19??.nc') 
# print variables 
f.variables.keys() 

atemp = f.variables['air'] 
print atemp 

ntimes, ny, nx = shape(atemp) 
cold_days = zeros((ny,nx),dtype=int) 

# create output NetCDF file 

nco = netCDF4.Dataset('/usgs/data2/notebook/cold_days.nc','w',clobber=True) 
nco.createDimension('x',nx) 
nco.createDimension('y',ny) 
nco.createDimension('time',ntimes) 

cold_days_v = nco.createVariable('cold_days', 'i4', ('time', 'y', 'x')) 
cold_days_v.units='days' 
cold_days_v.long_name='total number of days below 0 degC' 
cold_days_v.grid_mapping = 'Lambert_Conformal' 

timeo = nco.createVariable('time','f8',('time')) 
lono = nco.createVariable('lon','f4',('y','x')) 
lato = nco.createVariable('lat','f4',('y','x')) 
xo = nco.createVariable('x','f4',('x')) 
yo = nco.createVariable('y','f4',('y')) 
lco = nco.createVariable('Lambert_Conformal','i4') 

# copy all the variable attributes from original file 
for var in ['time','lon','lat','x','y','Lambert_Conformal']: 
    for att in f.variables[var].ncattrs(): 
     setattr(nco.variables[var],att,getattr(f.variables[var],att)) 

# copy variable data for time, lon,lat,x and y 
timeo[:] = f.variables['time'][:] 
lato[:] = f.variables['lat'][:] 
xo[:] = f.variables['x'][:] 
yo[:] = f.variables['y'][:] 

for i in xrange(ntimes): 
    cold_days += atemp[i,:,:].data-273.15 < 0 
    # write the cold_days data 
    cold_days_v[i,:,:]=cold_days 


# copy Global attributes from original file 
for att in f.ncattrs(): 
    setattr(nco,att,getattr(f,att)) 

nco.Conventions='CF-1.6' 
nco.close() 
+0

Я не проводил много испытаний между моим методом выше и методом Рича, но из того, что я видел, оба работали примерно с одинаковой скоростью. – mkmitchell

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