我正在尝试创建多个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: sum 29231.2
1: total sum 0.0
2: sum 29231.2
2: total sum 8249.65
1: sum 25840.5
1: total sum 8249.65
2: sum 25840.5
2: total sum 7055.33
我希望对于第一个文件,第一个数组和运行总和的总和应该是相同的。两个数据集中都没有负值,那么这怎么可能呢?
更新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:
Soooo ...当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
现在的问题是,