平均多个numpy数组时的总和不正确

时间:2013-04-23 15:45:59

标签: 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')
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

现在的问题是,

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

0 个答案:

没有答案