我正在尝试从多个 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 数组。执行 a 时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
现在的问题是,