2

我正在尝试从多个 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

现在的问题是,

您如何有效地为给定的文件/日期范围创建累积掩码,而无需处理两次初始化所有数据?

4

0 回答 0