Питон-НП.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 годов с первым средним (с монли-значениями, усредненными в годовые значения. Черная линия-это ансамблевое среднее , а цветные линии-это индивидуальные пробеги.

Введите описание изображения здесь

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

Введите описание изображения здесь

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

Вопрос

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

1 7

1 ответ:

В строке

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

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

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

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