2016-07-25 354 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()计算错误值的第一次?我尝试使用np.mean()时,将数据类型指定为float,就像在这个问题中一样 - Wrong numpy mean value? 但是它不起作用。任何方式,我可以解决它,所以它第一次正常工作?我不希望这个问题在计算中发生,因为它不容易发现数学错误。

+1

沃伦 - 我将我的代码更改为您的建议,并且您绝对正确!我忘记了沿着轴3的最后一个槽在第一次运行时是空的,但不是当你重新运行代码时。无论如何,发布你说的答案,我会接受它。 :) – ChristineB

+0

好的,回答补充。 –

回答

8

在线路

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

的参数meanalltas[:,:,:,:50]

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

否则要包括在该合奏装置的计算那些最终零。