2017-07-16 136 views
1

我正在將xarrays分割成機器學習過程的小數據塊,並且試圖過濾掉其中沒有數據值的多維數據集。檢查python xarray數據集中是否存在值

我想保持內存佔用小,並已分配一個不可能的值爲-999到無數據值。這樣做是爲了讓事情int16,而不需要爲nan

問題更大的類型:什麼是檢查是否存在在xarray.Dataset -999的最佳方式?

以下是我有:

(dataset == -999).any() 

將一代產量:

<xarray.Dataset> 
Dimensions: () 
Data variables: 
    var_a  bool True 
    var_b  bool True 
    var_c  bool False 

之後

我很可能要選擇類似 var_a。我的代碼最終會這樣看:

def is_clean(dataset): 
    return (dataset == -999).any().var_a is True 

也許我還記憶猶新,當談到Xarrays,但我不能找到一個更好的方式在文檔中做到這一點。關於xarrays,我缺少什麼樣的結構化知識,使我無法與當前的解決方案保持一致?任何提示?

+0

'return(dataset.var_a == -999).any()'? –

+0

感謝您的回覆。我的問題是'return(dataset.var_a == -999).any()'將返回一個不是布爾值的'xr.Dataset'。 – Conic

+0

返回的「xr.Dataset」的維度是什麼? –

回答

3

xarray對象上的表達式通常返回相同類型的新xarray對象。這意味着(dataset.var_a == -999).any()導致標量爲xarray.DataArray對象。

與標量NumPy數組類似,標量DataArray對象可以通過調用它們上的內建類型(如bool()float())來收件箱。例如,這種情況隱含在if語句的條件內。與NumPy數組類似,您可以使用.item()方法解開任何dtype的標量DataArray。

要檢查DataSet中的每一個數據變量,你要麼需要使用字典一樣的訪問,例如,

def is_clean(dataset): 
    return all((v != -999).all() for v in dataset.data_vars.values()) 

或者你可以在整個數據集通過調用轉換成一個單一的DataArray中在數據集迭代.to_array(),例如,

def is_clean(dataset): 
    return bool(dataset.to_array() != -999).all()) 

爲了避免過多的內存使用情況,您可以轉換成數組減少,這是長一點,但不是太糟糕後:

def is_clean(dataset): 
    return bool((dataset != -999).all().to_array().all()) 
+0

感謝這個偉大的答案。根據我所瞭解的熊貓/ numpy,這是我的期望。猜猜我應該安裝xarray,並學習一些東西。 –