Python 对多个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数组中创建元素平均值的数组。将两个数组相加时(使用
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