2016-06-21 66 views
3

我嘗試從具有NoData值的數組中檢索百分位數。在我的情況下,Nodata值是-3.40282347e + 38。我認爲一個蒙面數組會將這個值從進一步的計算中排除。我成功地創建了蒙版數組,但對於np.percentile()函數,蒙版沒有任何效果。如何在掩碼數組上運行numpy函數percentile()?

>>> DataArray = np.array(data) 
>>> DataArray 

([[ value, value...]], dtype=float32) 

>>> masked_data = ma.masked_where(DataArray < 0, DataArray) 
>>> p5 = np.percentile(masked_data, 5) 
>>> print p5 

-3.40282347e+38 
+0

最好使用屏蔽的方法或np.ma功能。許多np函數委託給方法,但不要指望它 – hpaulj

回答

2

看看np.percentile代碼,很明顯它沒有什麼特別的掩碼數組。

def percentile(a, q, axis=None, out=None, 
       overwrite_input=False, interpolation='linear', keepdims=False): 
    q = array(q, dtype=np.float64, copy=True) 
    r, k = _ureduce(a, func=_percentile, q=q, axis=axis, out=out, 
        overwrite_input=overwrite_input, 
        interpolation=interpolation) 
    if keepdims: 
     if q.ndim == 0: 
      return r.reshape(k) 
     else: 
      return r.reshape([len(q)] + k) 
    else: 
     return r 

_ureduce_percentilenumpy/lib/function_base.py限定內部功能。所以真正的行動是更復雜的。

蒙面數組有2種使用numpy函數的策略。一個是fill - 用無害的值代替蒙面值,例如做sum時爲0,做產品時爲1。另一種是compress的數據 - 即刪除所有屏蔽值。

例如:

In [997]: data=np.arange(-5,10) 
In [998]: mdata=np.ma.masked_where(data<0,data) 

In [1001]: np.ma.filled(mdata,0) 
Out[1001]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [1002]: np.ma.filled(mdata,1) 
Out[1002]: array([1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [1008]: mdata.compressed() 
Out[1008]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

這是打算給你想要的percentile?填充還是壓縮?或者沒有。您需要充分了解百分位數的概念,以瞭解它應該如何應用於蒙面值。

+0

壓縮()爲我做了訣竅。因爲我需要在百分比計算之前完全排除NoData值。 – EikeMike

2

如果您填寫您的蒙面值np.nan,然後你可以使用np.nanpercentile

import numpy as np 
data = np.arange(-5.5,10.5) # Note that you need a non-integer array to store NaN 
mdata = np.ma.masked_where(data < 0, data) 
mdata = np.ma.filled(mdata, np.nan) 
np.nanpercentile(mdata, 50) # 50th percentile 
相關問題