簡體   English   中英

處理蒙版的numpy數組

[英]Handling masked numpy array

我已經屏蔽了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]

還有其他有效的方法可以做到這一點,請告訴我。 非常感謝您的建議或意見。

可以使用循環代替循環

correction = model_dry_tropo_corr/2 + solid_earth_tide

這將創建一個新的蒙版數組,其中包含您的答案和蒙版。 然后,您可以從新數組訪問未屏蔽的值。

我對此代碼感到困惑

try :
    model_dry_tropo_corr[i].mask=True
   continue

except :
    Pass

我沒有安裝netCDF4 ,但是從文檔中可以看到您的變量看起來像,甚至可能是numpy.ma掩碼數組。

如果您打印此變量的全部或一部分,並且具有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)

我可以使用以下命令測試給定元素的掩碼是否為True / False:

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

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

但是如果我先索引

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM