【问题标题】:Python- np.mean() giving wrong means?Python- np.mean() 给出错误的方法?
【发布时间】: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 的最后一个插槽是空的,但当您重新运行代码时却不是。无论如何,将您所说的发布为答案,我会接受。 :)

标签: python numpy mean


【解决方案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)

否则,您将在整体均值的计算中包括那些最后的零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多