2015-01-20 22 views
3

我有一個複雜的計算,我期望結果是一個數組,其中的值按排序順序排列。但是,由於某些關鍵點的數值錯誤,某些結果值是錯誤的。我想掩蓋這些值。我應該怎麼做?在numpy中不按排序順序的掩碼值

這裏是一個等價的函數,但假設值從高到低排序,而外人總是大於預期值。我想知道是否有一個更簡單,更有效的方法來做到這一點。

def maskoutsiders(a): 
    mask = numpy.zeros(len(a)) 
    lastval = a[0] 
    for i in range(1, len(a)): 
     if a[i] > lastval: 
      mask[i] = 1 
     else: 
      lastval = a[i] 

    return ma.masked_array(a, mask=mask) 
+0

所以,從索引0開始,你想挑選標記嚴格增長子序列的指標的數組(並掩蓋其他指標)?例如。 '[3,1,2,4,5]'會是'[真,假,假,真,真]'? – 2015-01-20 20:39:17

+0

是的!此外,只有一些不好的值,但是這些不好的值可能在2或3的組中。另外,在ma中,1被屏蔽,0被屏蔽。 – 2015-01-20 20:42:44

回答

4

a應該在下降,你可以使用:

mask = a > np.minimum.accumulate(a) 

a應該在增加,你可以使用:

mask = a < np.maximum.accumulate(a) 

npnumpy

例如,

In [44]: def mymaskoutsiders(a): 
    ....:  mask = a > np.minimum.accumulate(a) 
    ....:  return ma.masked_array(a, mask=mask) 
    ....: 

比較結果與此陣:

In [100]: x 
Out[100]: array([ 13. , 16.5, 15.5, 11.5, 6. , 9.5, 5.5, 9. , 5. , 2.5]) 

這是你的功能:

In [101]: maskoutsiders(x) 
Out[101]: 
masked_array(data = [13.0 -- -- 11.5 6.0 -- 5.5 -- 5.0 2.5], 
      mask = [False True True False False True False True False False], 
     fill_value = 1e+20) 

這是我的版本:

In [102]: mymaskoutsiders(x) 
Out[102]: 
masked_array(data = [13.0 -- -- 11.5 6.0 -- 5.5 -- 5.0 2.5], 
      mask = [False True True False False True False True False False], 
     fill_value = 1e+20)