4

完全にマスクされた配列の合計の結果がゼロになることを期待しますが、代わりに「マスクされた」が返されます。関数がゼロを返すようにするにはどうすればよいですか?

>>> 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
4

1 に答える 1

4

あなたの最後のケースでは:

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
    ....

それは

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

maskedあなたのケースで価値 を生み出す行。newmaskすべての値がマスクされている場合は True であり、一部の値がマスクされていない場合は 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

于 2016-12-14T00:32:40.663 に答える