Вопрос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 значения. Черная линия ансамблевые средние & цветных линии отдельные трассы.
Очевидно, что отклоняется ниже реального ансамбля. Вот как выглядит сюжет, когда я запускаю alltas [:,:,:,, 50] = np.mean (alltas, axis = 3, dtype = np.float64) во второй раз & сохранить все остальное То же самое.
Гораздо лучше.
Вопрос
Почему np.mean() вычислить неверное значение в первый раз? Я попытался указать тип данных как float при использовании np.mean(), как в этом вопросе. Wrong numpy mean value? Но это не сработало. Как я могу это исправить, так что он работает правильно в первый раз? Я не хочу, чтобы эта проблема возникала при вычислении, где не так легко заметить математическую ошибку.
Уоррен - я изменил свой код на то, что вы предложили, и вы абсолютно правы! Я забыл, что окончательный слот вдоль оси 3 был пуст в первом прогоне, но не при повторном запуске кода.В любом случае, напишите, что вы сказали как ответ, и я соглашусь с ним. :) – ChristineB
OK, ответ добавлен. –