2013-05-30 45 views
3

我有一個NetCDF文件,其中包含一個帶有精度/刻度== 7/2的浮點值的變量,即有可能的值從-99999.99到99999.99。如何將NetCDF變量浮點數據讀取爲具有與原始NetCDF浮點值相同的精度和比例的Numpy數組?

當我從NetCDF變量中取出一部分值並在調試器中查看它們時,我發現現在我的數組中的值具有比我在原始NetCDF中看到的更高的精度/比例。例如,當我查看ToosUI/ncdump查看器中的值時,它們顯示爲'-99999.99'或'12 .45',但是當我查看切片數組中的值時,它們看起來像'-99999.9921875'(更大的比例長度)。因此,如果我使用'-99999.99'作爲預期值來指示丟失的數據點,那麼我將無法匹配拉入切片陣列的匹配項,因爲這些值具有更大的比例長度,尺度不僅僅是填充的零。

比如我看到這一點,如果我做了ncdump上的NetCDF數據集內的一個點:

Variable: precipitation(0:0:1, 40:40:1, 150:150:1) 

float precipitation(time=1348, lat=180, lon=360); 
    :units = "mm/month"; 
    :long_name = "precipitation totals"; 

data: 

    { 
    { 
     {-99999.99} 
    } 
    } 

但是,如果我得到的數據的切片從變量像這樣:

value = precipitationVariable[0:1:1, 40:41:1, 150:151:1] 

然後我看到像這樣在我的調試器(的Eclipse/PyDev的):

value == ndarray: [[[-99999.9921875]]] 

所以它看起來好像NetCDF數據將我讀入Numpy數組的設置值與NetCDF文件中的原始值的相同精度/比例不同時讀取。或者NetCDF中的值實際上與我讀到的值相同,但是由於ncdump程序本身的某些格式設置,通過ncdump向我顯示的內容正在被截斷。

任何人都可以建議這裏發生了什麼?在此先感謝您的幫助。

BTW我正在開發一個Windows XP計算機上使用Python 2.7.3此代碼,並使用此規定的NetCDF4 API的Python模塊:https://code.google.com/p/netcdf4-python/

回答

6

有你想要,因爲numpy的做什麼的沒有簡單的方法將值存儲爲單精度,因此它們始終具有0.99後的尾數。

但是,netCDF已經提供了缺失數據的機制(請參閱best practices guide)。 netCDF文件是如何寫在第一位的? missing_value是一個special variable attribute,應該用來指示那些缺失的值。在C和Fortran接口中,當創建文件時,所有變量值都被設置爲缺失。如果您一次編寫一個變量,則可以將missing_value屬性設置爲缺少值的索引數組。請參閱有關CFortran接口中填充值的更多信息。這是推薦的方法。 python netCDF4模塊可以很好地處理這些缺失的值,並且這些數組在numpy中被讀爲掩碼數組。

如果你必須與你目前擁有的文件工作,那麼我建議建立一個面具覆蓋在你的缺失值值:

import numpy as np 
value = precipitationVariable[:] 
mask = (value < -99999.98) & (value > -100000.00) 
value = np.ma.MaskedArray(value, mask=mask) 
+0

感謝,@tiago,你寫得很好,非常翔實響應。 –