【发布时间】:2016-11-29 07:27:36
【问题描述】:
问题
所以我有 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]=np.mean(alltas,axis=3,dtype=np.float64) 并保持其他所有内容相同时的情节。
好多了。
问题
为什么 np.mean() 第一次计算错误的值?我尝试在使用 np.mean() 时将数据类型指定为浮点数,就像在这个问题中一样-Wrong numpy mean value? 但它没有用。有什么办法可以修复它,使其第一次正常工作?我不希望在不容易发现数学错误的计算中出现这个问题。
【问题讨论】:
-
Warren-我将代码更改为您建议的内容,您绝对正确!我忘记了第一次运行时沿轴 3 的最后一个插槽是空的,但当您重新运行代码时却不是。无论如何,将您所说的发布为答案,我会接受。 :)