NC矩陣遮罩之檢查與修改
Table of contents
背景
- 一般
nc
檔案的矩陣會自動以masked array
numpy.ma.array型式儲存,以處理錯誤值、空缺值。- 發生在創造新變數、延長或放大矩陣的維度等操作,卻在儲存前沒有給定數據,
python
程式會自動遮蔽該區域的內容。 - 雖然嚴格來說填充的策略有所不同。
- 一個被遮蔽的
nc
檔案,在讀、寫時會遭遇困難,因為一般填入的數字是個極大值9.969209968386869e+36
- 如果被遮蔽的是個模版,延長放大之後,對程式執行而言會是個災難。
mask
與否是ma
矩陣的性質,不是nc
檔案或變數的屬性,因此不能直接修改其狀態。
檢查
- 網友詳細報告了
nc
矩陣遮蔽造成的困擾。實際發生時,會延長程式的執行時間。 - 進入
ipython
對話命令列,打開nc
檔案,印出變數矩陣nc.variables[c][:]
(是個ma
)的mask
屬性
In [1]: import numpy as np
In [2]: import netCDF4
In [3]: fname='template_v7.nc'
In [4]: nc = netCDF4.Dataset(fname, 'r+')
In [5]: c='CO'
In [6]: nc.variables[c][:].mask
Out[6]:
array([[ True],
[ True]])
- 結果是一個布林的矩陣,因某些因素,
CO
的值沒有給定、被遮蔽了,如果執行nc.variables[c][:].data
,可以發現其值為前述的極大值
修正
In [7]: nc.variables[c][:].mask=False
In [8]: nc.variables[c][:].mask
Out[8]:
array([[ True],
[ True]])
In [9]: nc.variables[c].set_auto_mask(False)
In [10]: nc.variables[c].set_always_mask(False)
In [11]: nc.variables[c][:].mask
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-11-ccd20a5de01b> in <module>
----> 1 nc.variables[c][:].mask
AttributeError: 'numpy.ndarray' object has no attribute 'mask'
In [12]: nc.variables[c][:]
Out[12]:
array([[9.96921e+36],
[9.96921e+36]], dtype=float32)
set_auto_mask
、set_always_mask
這2個設定似乎是將masked array
整個換掉,所以連mask
的屬性都沒有了,成了一般的np.array
。- 其值為前述的極大值
- 給定數值後存檔、再開
In [13]: nc.variables[c][:]=0.5
In [14]: nc.close()
In [15]: nc = netCDF4.Dataset(fname, 'r+')
In [16]: nc.variables[c][:]
Out[16]:
masked_array(
data=[[0.5],
[0.5]],
mask=False,
fill_value=1e+20,
dtype=float32)
- 其值已被改變,但仍然被程式改成
masked_array
,只是因為已有確定的數據,mask
屬性都改成了False
。
Reference
- discussion, Variables became numpy masked arrays, github.issues, 17 Oct 2018
- unidata, netCDF4 Version 1.5.8, github.io,
- gujianmu, netcdf4和masked array 博客園