2

複数のnumpy配列から要素の平均を作成して配列しようとしています。2 つの配列を (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'

出力(ディレクトリに 2 つのデータ ファイルを含む)

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: すっごく... netCDF4netCDF データセットに欠損値があると、マスクされた 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

問題は今、

すべてのデータを2回初期化することなく、指定されたファイル/日付範囲の累積マスクを効率的に作成するにはどうすればよいですか?

4

0 に答える 0