2016-06-16 25 views
0

私はnumpy配列をマスクしました。要素のそれぞれに対して処理を実行しながら、まず特定の要素がマスクされているかどうかを確認する必要があります。マスクされていれば、その要素をスキップする必要があります。私はこのように試してみましたマスキングされたnumpy配列の処理

from netCDF4 import Dataset 

data=Dataset('test.nc') 
dim_size=len(data.dimensions[nc_dims[0]]) 
model_dry_tropo_corr=data.variables['model_dry_tropo_corr'][:] 
solid_earth_tide=data.variables['solid_earth_tide'][:] 

for i in range(0,dim_size) 
    try : 
     model_dry_tropo_corr[i].mask=True 
     continue 

    except : 
     Pass 

    try: 
     solid_earth_tide[i].mask=True 
     continue 
    except: 
     Pass 

    correction=model_dry_tropo_corr[i]/2+solid_earth_tide[i] 

これを行うには、他の効率的な方法があり、私に教えてください。あなたの提案やコメントは高く評価されます。代わりに、ループの

+0

ための充填を行っているが、あなたは 'における要素の持つ要素をループすることができます:私たちにあなたがしている実際の動作を'代わりにぎこちなくLEN – Keatinge

+0

の範囲を使用しての表示しますそれをベクトル化しようとすることができます。配列をループで反復することは無駄です。 –

+0

私は質問を編集しようとしました、私はより理解できることを願っています。 – PUJA

答えて

1

あなたの答えとマスクを持つことになり、新たなマスクされた配列を作成します

correction = model_dry_tropo_corr/2 + solid_earth_tide 

これを使用することができます。新しい配列からマスクされていない値にアクセスすることができます。

0

私はnetCDF4がインストールされていないが、それはあなたの変数は多分numpy.maマスクされた配列になり、次のようになります文書から表示されます。このコード

try : 
    model_dry_tropo_corr[i].mask=True 
    continue 

except : 
    Pass 

について困惑しています。

この変数の全部または一部をshapeやdtypeなどの属性で印刷すると便利です。

は、私のような式でマスクされた配列を作ることができます:私は指定された要素のマスクかどうかをテストすることができ

In [746]: M=np.ma.masked_where(np.arange(10)%3==0,np.arange(10)) 

In [747]: M 
Out[747]: 
masked_array(data = [-- 1 2 -- 4 5 -- 7 8 --], 
      mask = [ True False False True False False True False False True], 
     fill_value = 999999) 

場合とFALSE TRUE /:

In [748]: M.mask[2] 
Out[748]: False 

In [749]: M.mask[3] 
Out[749]: True 

しかし、最初にI指数であれば、

In [754]: M[2] 
Out[754]: 2 

In [755]: M[3] 
Out[755]: masked 

In [756]: M[2].mask=True 
... 
AttributeError: 'numpy.int32' object has no attribute 'mask' 

In [757]: M[3].mask=True 

したがって、try/exceptは、マスクがTrueに設定されている要素をスキップします。

しかし、私はそれを行うことが明らかであると思う:

if model_dry_tropo_corr.mask[i]: 
    continue 

しかし、それはまだ反復的です。

しかし、@user3404344に示されているように、変数を使用して数学を実行できます。マスキングは引き継がれます。マスクされた値が「不良」であり、計算にエラーが発生する場合は、問題になる可能性があります。

私は別のマスクされた配列を定義した場合

In [764]: N=np.ma.masked_where(np.arange(10)%4==0,np.arange(10)) 

In [765]: N+M 
Out[765]: 
masked_array(data = [-- 2 4 -- -- 10 -- 14 -- --], 
      mask = [ True False False True True False True False True True], 
     fill_value = 999999) 

あなたがMNのいずれかでマスクした要素は、私が唯一の有効なを与えることcompressed方法を使用することができます

結果にマスクされているかを確認することができます要素

In [766]: (N+M).compressed() 
Out[766]: array([ 2, 4, 10, 14]) 

マスクされた配列を使用して数式を計算するときは、埋め込みも便利です。

In [779]: N.filled(0)+M.filled(0) 
Out[779]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9]) 

私は問題の計算を中和するためにfilledを使用して、まだそれらの値

In [785]: z=np.ma.masked_array(N.filled(0)+M.filled(0),mask=N.mask|M.mask) 

In [786]: z 
Out[786]: 
masked_array(data = [-- 2 4 -- -- 10 -- 14 -- --], 
      mask = [ True False False True True False True False True True], 
     fill_value = 999999) 

おっとをマスクすることができ、私は計算をいじりマスクされた値を心配する必要はありません。マスクされたほかは、あなたの質問に全く関係のない私

In [787]: (N+M).data 
Out[787]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9]) 

In [788]: N.data+M.data # raw unmasked addition 
Out[788]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) 

In [789]: z.data  # same as the (N+M).data 
Out[789]: array([ 0, 2, 4, 3, 4, 10, 6, 14, 8, 9]) 
関連する問題