问题
因此,我有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()第一次计算错误的值?我在使用np.mean()时尝试将数据类型指定为float,如此问题中所示 - Wrong numpy mean value? 但它没有用。我能以任何方式解决它,以便第一次正常工作吗?我不希望在计算中发生此问题,因为它不容易发现数学错误。
答案 0 :(得分: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)
否则,您将在计算集合平均值时包括那些最后的零。