Python 对多个numpy数组求平均值时的和不正确
我试图从多个numpy数组中创建元素平均值的数组。将两个数组相加时(使用Python 对多个numpy数组求平均值时的和不正确,python,numpy,netcdf,Python,Numpy,Netcdf,我试图从多个numpy数组中创建元素平均值的数组。将两个数组相加时(使用numpy.add()或通过广播a1+a2),生成的总和似乎不正确 代码 from netCDF4 import Dataset import numpy import os data_dir = /my_data/ data_files = np.asarray(os.listdir(data_dir)) dataset = Dataset(os.path.join(data_dir,data_files[0]),'r'
numpy.add()
或通过广播a1+a2
),生成的总和似乎不正确
代码
from netCDF4 import Dataset
import numpy
import os
data_dir = /my_data/
data_files = np.asarray(os.listdir(data_dir))
dataset = Dataset(os.path.join(data_dir,data_files[0]),'r')
vals_sum = np.zeros_like(dataset.variables["vals"][:][:])
for data_file in data_files:
current_file = os.path.join(data_dir,data_file)
dataset = Dataset(current_file,'r')
vals = dataset.variables["vals"][:][:]
print '1: sum', np.sum(vals)
print '1: total sum', np.sum(vals_sum)
vals_sum = np.add(vals, vals_sum)
print '2: sum', np.sum(vals)
print '2: total sum', np.sum(vals_sum)
print '\n'
输出(目录中有两个数据文件)
我希望对于第一个文件,第一个数组的和和运行的和应该是相同的。两个数据集中都没有负值,这怎么可能呢
更新1:
在尝试vals=np.copy(dataset.variables[“vals”])
后,它似乎已将缺少的值转换为-999
,这与用于初始化数组的其他方法不同。尽管:
1: sum -9.24455e+08
1: total sum 0.0
2: sum -9.24455e+08
2: total sum -8.10467e+07
1: sum -9.31734e+08
1: total sum -8.10467e+07
2: sum -9.31734e+08
2: total sum -1.57788e+08
更新2:
太好了。。。当netCDF数据集中缺少值时,netCDF4
似乎会自动神奇地创建一个屏蔽numpy数组。执行np.zeros_like()
时,会复制屏蔽值。这意味着我从我的第一个数据文件创建的零数组,尽管它具有相同数量的元素,但它是使用一个掩码创建的,其中该文件缺少数据。当遮罩数组加在一起时,它们的遮罩也是一样,这将给出不同的总和
import numpy.ma as ma
import numpy as np
x = np.array([1,5,7,-999,45,2,-999])
y = np.array([-999,89,-999,80,34,31,1])
mx = ma.masked_less(x,0)
my = ma.masked_less(y,0)
x0 = np.zeros_like(mx)
np.sum(my) # yields 235
np.sum(my+x0) # yields 154
现在的问题是,
如何有效地为给定的文件/日期范围创建一个累积掩码,而无需对所有数据进行两次初始化处理?为什么对第一个文件的输出感到满意?第一个文件的
np.sum(vals)
和np.sum(vals+vals\u sum)
不应该是相同的吗?但是它们不是。另外,Dataset
是否打开文件?你是否需要先关闭它以确保他们没有发生奇怪的事情?尝试类似于将数据集(当前文件“r”)作为数据集的:我建议对每个文件打印vals.shape
和vals\u sum.shape
,以确保没有广播发生。如果存在广播,则一个或另一个数组中的每个值将被计数几次(与形状匹配所需的相乘次数相同)。对于数组,a=[1,2,3];b=[1]
,那么sum(a)+sum(b)
与sum(a+b)
不一样,因为b
在后一种情况下会被计数三次。如果将vals=dataset.variables[“vals”[:][:]
替换为vals=np copy(dataset.variables[“vals”])
,这与问题无关,但是您可以用更紧凑的vals\u sum+=vals
替换vals\u sum=np.add(vals,vals\u sum)
。
import numpy.ma as ma
import numpy as np
x = np.array([1,5,7,-999,45,2,-999])
y = np.array([-999,89,-999,80,34,31,1])
mx = ma.masked_less(x,0)
my = ma.masked_less(y,0)
x0 = np.zeros_like(mx)
np.sum(my) # yields 235
np.sum(my+x0) # yields 154