Это следующий вопрос, связанный с 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 для выполнения этого типа операции?
Почему вы решили перевернуть x и y? Ответ http://stackoverflow.com/questions/18665078/loop-through-netcdf-files-and-run-calculations-python-or-r не пересекает x и y и будет намного быстрее. –
для i в xrange (ntimes): cold_days + = atemp [i,:,:]. Data-273.15 <0 предоставил единый кадр во временной матрице с кумулятивными холодными днями в течение года. Он не сравнивался с предыдущими временными рамками и соответствующим образом регулировал. Я попытаюсь заменить x и y на: – mkmitchell
Я получаю сообщение об ошибке. Я также пробовал данные atemp [i,:,:]. if atemp [i,:,:] <273.15: ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте a.any() или a.all() – mkmitchell