Python-np.mean()给出了错误的手段?

Chr*_*neB 7 python numpy 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)
Run Code Online (Sandbox Code Playgroud)

我重复其他数据集的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)
Run Code Online (Sandbox Code Playgroud)

当我检查一个坐标和月份时,整体意味着它应该是什么.这是1950-2100全球平均温度的图表与第一个均值相似(monhly值平均为年度值.黑线是整体平均值,彩色线是单独运行.

在此输入图像描述

显然偏离真正的合奏意味着.这是我第二次运行alltas [:,:,:,50] = np.mean(alltas,axis = 3,dtype = np.float64)并保持其他所有内容时的情节.

在此输入图像描述

好多了.

这个问题

为什么np.mean()第一次计算错误的值?我在使用np.mean()时尝试将数据类型指定为float,就像在这个问题中一样 - 错误的numpy平均值? 但它没有用.我能以任何方式解决它,以便第一次正常工作吗?我不希望在计算中发生这个问题,因为它不容易注意到数学错误.

War*_*ser 8

在线

alltas[:,:,:,50] = np.mean(alltas,axis=3,dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)

该论点mean应该是alltas[:,:,:,:50]:

alltas[:,:,:,50] = np.mean(alltas[:,:,:,:50], axis=3, dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)

否则,您将在计算集合平均值时包含最后的零.