2016-12-14 49 views
2

我期望一個完全屏蔽的數組的求和結果爲零,但會返回「被屏蔽」的結果。我怎樣才能讓函數返回零?Numpy masked_array sum

>>> a = np.asarray([1, 2, 3, 4]) 
>>> b = np.ma.masked_array(a, mask=~(a > 2)) 
>>> b 
masked_array(data = [-- -- 3 4], 
      mask = [ True True False False], 
     fill_value = 999999) 

>>> b.sum() 
7 
>>> b = np.ma.masked_array(a, mask=~(a > 5)) 
>>> b 
masked_array(data = [-- -- -- --], 
     mask = [ True True True True], 
    fill_value = 999999) 


>>> b.sum() 
masked 
>>> np.ma.sum(b) 
masked 
>>> 

這裏還有一個意想不到的事情:

>>> b.sum() + 3 
masked 

回答

1

在你最後一種情況:

In [197]: bs=b1.sum() 
In [198]: bs.data 
Out[198]: array(0.0) 
In [199]: bs.mask 
Out[199]: array(True, dtype=bool) 
In [200]: repr(bs) 
Out[200]: 'masked' 
In [201]: str(bs) 
Out[201]: '--' 

如果我指定keepdims,我得到一個不同的數組:

In [208]: bs=b1.sum(keepdims=True) 
In [209]: bs 
Out[209]: 
masked_array(data = [--], 
      mask = [ True], 
     fill_value = 999999) 
In [210]: bs.data 
Out[210]: array([0]) 
In [211]: bs.mask 
Out[211]: array([ True], dtype=bool) 

這裏的相關的在sum代碼的螞蟻部分:

def sum(self, axis=None, dtype=None, out=None, keepdims=np._NoValue): 
    kwargs = {} if keepdims is np._NoValue else {'keepdims': keepdims} 

    _mask = self._mask 
    newmask = _check_mask_axis(_mask, axis, **kwargs) 
    # No explicit output 
    if out is None: 
     result = self.filled(0).sum(axis, dtype=dtype, **kwargs) 
     rndim = getattr(result, 'ndim', 0) 
     if rndim: 
      result = result.view(type(self)) 
      result.__setmask__(newmask) 
     elif newmask: 
      result = masked 
     return result 
    .... 

這是產生在你的情況masked

newmask = np.ma.core._check_mask_axis(b1.mask, axis=None) 
... 
elif newmask: result = masked 

線。 newmask在所有值都被屏蔽的情況下爲真,而False則不是。返回np.ma.masked的選擇是故意的。

計算的核心是:

In [218]: b1.filled(0).sum() 
Out[218]: 0 

的代碼的其餘部分決定是否返回一個標量或掩蔽的陣列。

============

而且爲你增加:

In [232]: np.ma.masked+3 
Out[232]: masked 

它看起來像np.ma.masked是傳播本身橫跨計算一個特殊的數組。有點像np.nan

+0

我預計要返回一個標值,而不是一個數組(它已經結束了,我找所有尺寸的總和)。 – orange

+1

我加了'sum'代碼的相關部分。我可以理解,爲什麼當輸入被完全屏蔽時,返回值可能會有一些不明確的地方。關於這是否正確,我不知道任何辯論。如果你不喜歡這個結果,你可以將總和應用於'b.filled(0)'。 – hpaulj

+0

看起來像推理是'如果所有值都被屏蔽了,它就不能給出正確的標量值(即使總和的起始值爲0)'。 – hpaulj