2016-07-25 3 views
7

ВопросPython-np.mean() дает неправильные средства?

Поэтому у меня есть 50 файлов данных, которые содержат netCDF4 десятилетия месячных температурных прогнозов на глобальной сетке. Я использую np.mean(), чтобы сделать совокупность средних из всех 50 файлов данных вместе, сохраняя длину времени & пространственной шкалы, но np.mean() дает мне два разных ответа. В первый раз, когда я запускаю свой блок кода, он дает мне число, которое при усреднении по широте & долгота &, построенная по отдельным прогонам, немного ниже, чем должно быть в ансамбле. Если я повторно запустил блок, это даст мне другое значение, которое выглядит правильно.

Код

Я не могу скопировать каждую строку здесь, так как это долго, но вот что я делаю для каждого прогона.

#Historical (1950-2020) data 
ncin_1 = Dataset("/project/wca/AR5/CanESM2/monthly/histr1/tas_Amon_CanESM2_historical-r1_r1i1p1_195001-202012.nc") #Import data file 
tash1 = ncin_1.variables['tas'][:] #extract tas (temperature) variable 
ncin_1.close() #close to save memory 

#Repeat for future (2021-2100) data 
ncin_1 = Dataset("/project/wca/AR5/CanESM2/monthly/histr1/tas_Amon_CanESM2_historical-r1_r1i1p1_202101-210012.nc") 
tasr1 = ncin_1.variables['tas'][:] 
ncin_1.close() 

#Concatenate historical & future files together to make one time series array 
tas11 = np.concatenate((tash1,tasr1),axis=0) 

#Subtract the 1950-1979 mean to obtain anomalies 
tas11 = tas11 - np.mean(tas11[0:359],axis=0,dtype=np.float64) 

И я повторяю, что в 49 раз больше для других наборов данных. Каждый файл tas11, tas12 и т. Д. Имеет форму (1812, 64, 128), соответствующую длине времени в месяцах, широтах и ​​долготах.

Чтобы получить ансамбль, я делаю следующее.

#Move all tas data to one array 
alltas = np.zeros((1812,64,128,51)) #years, lat, lon, members (no ensemble mean value yet) 
alltas[:,:,:,0] = tas11 
(...) 
alltas[:,:,:,49] = tas50 

#Calculate ensemble mean & fill into 51st slot in axis 3 
alltas[:,:,:,50] = np.mean(alltas,axis=3,dtype=np.float64) 

Когда я проверяю координатная & месяц, ансамбль средний оторвется от того, что оно должно быть. Вот что сюжет глобально усредненные температуры от 1950-2100 выглядит с первым средним (с усредненной в годовые значения monhly значения. Черная линия ансамблевые средние & цветных линии отдельные трассы.

enter image description here

Очевидно, что отклоняется ниже реального ансамбля. Вот как выглядит сюжет, когда я запускаю alltas [:,:,:,, 50] = np.mean (alltas, axis = 3, dtype = np.float64) во второй раз & сохранить все остальное То же самое.

enter image description here

Гораздо лучше.

Вопрос

Почему np.mean() вычислить неверное значение в первый раз? Я попытался указать тип данных как float при использовании np.mean(), как в этом вопросе. Wrong numpy mean value? Но это не сработало. Как я могу это исправить, так что он работает правильно в первый раз? Я не хочу, чтобы эта проблема возникала при вычислении, где не так легко заметить математическую ошибку.

+1

Уоррен - я изменил свой код на то, что вы предложили, и вы абсолютно правы! Я забыл, что окончательный слот вдоль оси 3 был пуст в первом прогоне, но не при повторном запуске кода.В любом случае, напишите, что вы сказали как ответ, и я соглашусь с ним. :) – ChristineB

+0

OK, ответ добавлен. –

ответ

8

В строке

alltas[:,:,:,50] = np.mean(alltas,axis=3,dtype=np.float64) 

аргумент mean должен быть alltas[:,:,:,:50]:

alltas[:,:,:,50] = np.mean(alltas[:,:,:,:50], axis=3, dtype=np.float64) 

В противном случае вы в том числе те конечные нули в расчете ансамбля средств.

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