Example #1
0
 def setup_class(self):
     self.a = np.array(['2020-12-31', '2021-01-01', '2021-01-02'], dtype='M')
     self.mask_a = np.array([False, True, False])
     self.ma = Masked(self.a, mask=self.mask_a)
     self.b = np.array([['2021-01-07'], ['2021-01-31']], dtype='M')
     self.mask_b = np.array([[False], [True]])
     self.mb = Masked(self.b, mask=self.mask_b)
Example #2
0
 def setup_class(self):
     self.a = np.array([15, 255, 0], dtype='u1')
     self.mask_a = np.array([False, True, False])
     self.ma = Masked(self.a, mask=self.mask_a)
     self.b = np.unpackbits(self.a).reshape(6, 4)
     self.mask_b = np.array([False]*15 + [True, True] + [False]*7).reshape(6, 4)
     self.mb = Masked(self.b, mask=self.mask_b)
Example #3
0
 def setup_class(self):
     super().setup_class()
     self.qpv = self.pv << self.pv_unit
     self.pv_mask = np.array([(True, False),
                              (False, False),
                              (False, True)], [('p', bool), ('v', bool)])
     self.mpv = Masked(self.qpv, mask=self.pv_mask)
Example #4
0
 def test_all_explicit(self):
     a1 = np.array([[1., 2.],
                    [3., 4.]])
     a2 = np.array([[1., 0.],
                    [3., 4.]])
     if self._data_cls is not np.ndarray:
         a1 = self._data_cls(a1, self.a.unit)
         a2 = self._data_cls(a2, self.a.unit)
     ma1 = Masked(a1, mask=[[False, False],
                            [True, True]])
     ma2 = Masked(a2, mask=[[False, True],
                            [False, True]])
     ma1_eq_ma2 = ma1 == ma2
     assert_array_equal(ma1_eq_ma2.unmasked, np.array([[True, False],
                                                       [True, True]]))
     assert_array_equal(ma1_eq_ma2.mask, np.array([[False, True],
                                                   [True, True]]))
     assert ma1_eq_ma2.all()
     assert not (ma1 != ma2).all()
     ma_eq1 = ma1_eq_ma2.all(1)
     assert_array_equal(ma_eq1.mask, np.array([False, True]))
     assert bool(ma_eq1[0]) is True
     assert bool(ma_eq1[1]) is False
     ma_eq0 = ma1_eq_ma2.all(0)
     assert_array_equal(ma_eq0.mask, np.array([False, True]))
     assert bool(ma_eq1[0]) is True
     assert bool(ma_eq1[1]) is False
 def setup_class(self):
     self.a = np.arange(1., 7.).reshape(2, 3)
     self.mask_a = np.array([[True, False, False], [False, True, False]])
     self.ma = Masked(self.a, mask=self.mask_a)
     self.b = np.array([2.5, 10., 3.])
     self.mask_b = np.array([False, True, False])
     self.mb = Masked(self.b, mask=self.mask_b)
 def test_nonzero_0d(self):
     res1 = Masked(1, mask=False).nonzero()
     assert len(res1) == 1
     assert_array_equal(res1[0], np.ones(()).nonzero()[0])
     res2 = Masked(1, mask=True).nonzero()
     assert len(res2) == 1
     assert_array_equal(res2[0], np.zeros(()).nonzero()[0])
Example #7
0
def choose(a, choices, out=None, mode='raise'):
    """Construct an array from an index array and a set of arrays to choose from.

    Like `numpy.choose`.  Masked indices in ``a`` will lead to masked output
    values and underlying data values are ignored if out of bounds (for
    ``mode='raise'``).  Any values masked in ``choices`` will be propagated
    if chosen.

    """
    from astropy.utils.masked import Masked

    a_data, a_mask = Masked._get_data_and_mask(a)
    if a_mask is not None and mode == 'raise':
        # Avoid raising on masked indices.
        a_data = a.filled(fill_value=0)

    kwargs = {'mode': mode}
    if out is not None:
        if not isinstance(out, Masked):
            raise NotImplementedError
        kwargs['out'] = out.unmasked

    data, masks = _get_data_and_masks(*choices)
    data_chosen = np.choose(a_data, data, **kwargs)
    if out is not None:
        kwargs['out'] = out.mask

    mask_chosen = np.choose(a_data, masks, **kwargs)
    if a_mask is not None:
        mask_chosen |= a_mask

    return Masked(data_chosen, mask_chosen) if out is None else out
 def setup_class(self):
     self.a = np.array([[-np.inf, +np.inf, np.nan, 3., 4.]] * 2)
     self.mask_a = np.array([[False] * 5, [True] * 4 + [False]])
     self.ma = Masked(self.a, mask=self.mask_a)
     self.b = np.array([[3.0001], [3.9999]])
     self.mask_b = np.array([[True], [False]])
     self.mb = Masked(self.b, mask=self.mask_b)
Example #9
0
 def setup_class(self):
     super().setup_class()
     self.ma = Masked(self.a, mask=self.mask_a)
     self.mb = Masked(self.b, mask=self.mask_b)
     self.mc = Masked(self.c, mask=self.mask_c)
     self.msa = Masked(self.sa, mask=self.mask_sa)
     self.msb = Masked(self.sb, mask=self.mask_sb)
Example #10
0
 def test_can_initialize_with_masked_values(self):
     mcls = Masked(self.MyArray)
     mms = mcls(Masked(np.asarray(self.a), mask=self.m))
     assert isinstance(mms, Masked)
     assert isinstance(mms, self.MyArray)
     assert_array_equal(mms.unmasked, self.a)
     assert_array_equal(mms.mask, self.m)
 def setup_class(self):
     self.a = np.array([[np.nan, np.nan, 3.], [4., 5., 6.]])
     self.mask_a = np.array([[True, False, False], [False, True, False]])
     self.b = np.arange(1, 7).reshape(2, 3)
     self.mask_b = self.mask_a
     self.ma = Masked(self.a, mask=self.mask_a)
     self.mb = Masked(self.b, mask=self.mask_b)
Example #12
0
 def setup_class(self):
     self.ra = np.array([3., 5., 0.]) << u.hourangle
     self.dec = np.array([4., 12., 1.]) << u.deg
     self.sc = SkyCoord(self.ra, self.dec)
     self.mask = np.array([False, False, True])
     self.mra = Masked(self.ra, self.mask)
     self.mdec = Masked(self.dec, self.mask)
     self.msc = SkyCoord(self.mra, self.mdec)
 def test_full_like(self, value):
     o = np.full_like(self.ma, value)
     if value is np.ma.masked:
         expected = Masked(o.unmasked, True)
     else:
         expected = Masked(np.empty_like(self.a))
         expected[...] = value
     assert_array_equal(o.unmasked, expected.unmasked)
     assert_array_equal(o.mask, expected.mask)
 def check(self, func, *args, **kwargs):
     ma_list = kwargs.pop('ma_list', [self.ma, self.ma])
     a_list = [Masked(ma).unmasked for ma in ma_list]
     m_list = [Masked(ma).mask for ma in ma_list]
     o = func(ma_list, *args, **kwargs)
     expected = func(a_list, *args, **kwargs)
     expected_mask = func(m_list, *args, **kwargs)
     assert_array_equal(o.unmasked, expected)
     assert_array_equal(o.mask, expected_mask)
    def test_block(self):
        self.check(np.block)

        out = np.block([[0., Masked(1., True)],
                        [Masked(1, False), Masked(2, False)]])
        expected = np.array([[0, 1.], [1, 2]])
        expected_mask = np.array([[False, True], [False, False]])
        assert_array_equal(out.unmasked, expected)
        assert_array_equal(out.mask, expected_mask)
Example #16
0
    def test_equality_strings(self, op):
        m1 = Masked(np.array(['a', 'b', 'c']), mask=[True, False, False])
        m2 = Masked(np.array(['a', 'b', 'd']), mask=[False, False, False])
        result = op(m1, m2)
        assert_array_equal(result.unmasked, op(m1.unmasked, m2.unmasked))
        assert_array_equal(result.mask, m1.mask | m2.mask)

        result2 = op(m1, m2.unmasked)
        assert_masked_equal(result2, result)
Example #17
0
 def test_indirect_creation(self):
     assert self.MyArray not in Masked._masked_classes
     mms = Masked(self.a, mask=self.m)
     assert isinstance(mms, Masked)
     assert isinstance(mms, self.MyArray)
     assert_array_equal(mms.unmasked, self.a)
     assert_array_equal(mms.mask, self.m)
     assert self.MyArray in Masked._masked_classes
     assert Masked(self.MyArray) is type(mms)
Example #18
0
    def test_viewing(self):
        mms = Masked(self.a, mask=self.m)
        mms2 = mms.view()
        assert type(mms2) is mms.__class__
        assert_masked_equal(mms2, mms)

        ma = mms.view(np.ndarray)
        assert type(ma) is MaskedNDArray
        assert_array_equal(ma.unmasked, self.a.view(np.ndarray))
        assert_array_equal(ma.mask, self.m)
Example #19
0
 def setup_class(self):
     self.x = np.array([3., 5., 0.]) << u.m
     self.y = np.array([4., 12., 1.]) << u.m
     self.z = np.array([0., 0., 1.]) << u.m
     self.c = r.CartesianRepresentation(self.x, self.y, self.z)
     self.mask = np.array([False, False, True])
     self.mx = Masked(self.x, self.mask)
     self.my = Masked(self.y, self.mask)
     self.mz = Masked(self.z, self.mask)
     self.mc = r.CartesianRepresentation(self.mx, self.my, self.mz)
Example #20
0
    def test_choose_masked(self):
        ma = Masked(np.array([-1, 1]), mask=[True, False]).reshape((2, 1))
        out = ma.choose((self.ma, self.mb))
        expected = np.choose(ma.filled(0), (self.a, self.b))
        expected_mask = np.choose(ma.filled(0), (self.mask_a, self.mask_b)) | ma.mask
        assert_array_equal(out.unmasked, expected)
        assert_array_equal(out.mask, expected_mask)

        with pytest.raises(ValueError):
            ma.unmasked.choose((self.ma, self.mb))
 def test_interp(self):
     xp = np.arange(5.)
     fp = np.array([1., 5., 6., 19., 20.])
     mask_fp = np.array([False, False, False, True, False])
     mfp = Masked(fp, mask=mask_fp)
     x = np.array([1.5, 17.])
     mask_x = np.array([False, True])
     mx = Masked(x, mask=mask_x)
     out = np.interp(mx, xp, mfp)
     expected = np.interp(x, xp[mask_fp], fp[mask_fp])
     assert_array_equal(out.unmasked, expected)
     assert_array_equal(out.mask, mask_x)
Example #22
0
def where(condition, *args):
    from astropy.utils.masked import Masked
    if not args:
        return condition.nonzero(), None, None

    condition, c_mask = Masked._get_data_and_mask(condition)

    data, masks = _get_data_and_masks(*args)
    unmasked = np.where(condition, *data)
    mask = np.where(condition, *masks)
    if c_mask is not None:
        mask |= c_mask
    return Masked(unmasked, mask=mask)
Example #23
0
    def test_masked_list_subclass(self):
        class MyList(list):
            pass

        ml = MyList(range(3))
        mml = Masked(ml, mask=[False, True, False])
        assert isinstance(mml, Masked)
        assert isinstance(mml, MyList)
        assert isinstance(mml.unmasked, MyList)
        assert mml.unmasked == [0, 1, 2]
        assert_array_equal(mml.mask, np.array([False, True, False]))

        assert Masked(MyList) is type(mml)
 def test_meshgrid(self):
     a = np.arange(1., 4.)
     mask_a = np.array([True, False, False])
     ma = Masked(a, mask=mask_a)
     b = np.array([2.5, 10., 3., 4.])
     mask_b = np.array([False, True, False, True])
     mb = Masked(b, mask=mask_b)
     oa, ob = np.meshgrid(ma, mb)
     xa, xb = np.broadcast_arrays(a, b[:, np.newaxis])
     ma, mb = np.broadcast_arrays(mask_a, mask_b[:, np.newaxis])
     for o, x, m in ((oa, xa, ma), (ob, xb, mb)):
         assert_array_equal(o.unmasked, x)
         assert_array_equal(o.mask, m)
Example #25
0
    def nanfunc(a, *args, **kwargs):
        from astropy.utils.masked import Masked

        a, mask = Masked._get_data_and_mask(a)
        if issubclass(a.dtype.type, np.inexact):
            nans = np.isnan(a)
            mask = nans if mask is None else (nans | mask)

        if mask is not None:
            a = Masked(a, mask)
            if fill_value is not None:
                a = a.filled(fill_value)

        return np_func(a, *args, **kwargs)
    def test_insert(self):
        obj = (1, 1)
        values = Masked([50., 25.], mask=[True, False])
        out = np.insert(self.ma.flatten(), obj, values)
        expected = np.insert(self.a.flatten(), obj, [50., 25.])
        expected_mask = np.insert(self.mask_a.flatten(), obj, [True, False])
        assert_array_equal(out.unmasked, expected)
        assert_array_equal(out.mask, expected_mask)

        with pytest.raises(TypeError):
            np.insert(self.a.flatten(), obj, values)

        with pytest.raises(TypeError):
            np.insert(self.ma.flatten(), Masked(obj), values)
Example #27
0
 def test_whole_mask_setting_simple(self):
     ma = Masked(self.a)
     assert ma.mask.shape == ma.shape
     assert not ma.mask.any()
     ma.mask = True
     assert ma.mask.shape == ma.shape
     assert ma.mask.all()
     ma.mask = [[True], [False]]
     assert ma.mask.shape == ma.shape
     assert_array_equal(ma.mask, np.array([[True] * 3, [False] * 3]))
     ma.mask = self.mask_a
     assert ma.mask.shape == ma.shape
     assert_array_equal(ma.mask, self.mask_a)
     assert ma.mask is not self.mask_a
     assert np.may_share_memory(ma.mask, self.mask_a)
Example #28
0
    def test_regression_12978(self):
        """Regression tests for https://github.com/astropy/astropy/pull/12978"""
        # This case produced incorrect results
        mask = [False, True, False]
        x = np.array([1, 2, 3])
        xp = Masked(np.array([1, 2, 3]), mask=mask)
        fp =  Masked(np.array([1, 2, 3]), mask=mask)
        result = np.interp(x, xp, fp)
        assert_array_equal(result, x)

        # This case raised a ValueError
        xp = np.array([1, 3])
        fp =  Masked(np.array([1, 3]))
        result = np.interp(x, xp, fp)
        assert_array_equal(result, x)
class TestStringFunctions:
    # More elaborate tests done in test_masked.py
    @classmethod
    def setup_class(self):
        self.ma = Masked(np.arange(3), mask=[True, False, False])

    def test_array2string(self):
        out0 = np.array2string(self.ma)
        assert out0 == '[— 1 2]'
        # Arguments are interpreted as usual.
        out1 = np.array2string(self.ma, separator=', ')
        assert out1 == '[—, 1, 2]'
        # If we do pass in a formatter, though, it should be used.
        out2 = np.array2string(self.ma, separator=', ', formatter={'all': hex})
        assert out2 == '[———, 0x1, 0x2]'
        # Also as positional argument (no, nobody will do this!)
        out3 = np.array2string(self.ma, None, None, None, ', ', '',
                               np._NoValue, {'int': hex})
        assert out3 == out2
        # But not if the formatter is not relevant for us.
        out4 = np.array2string(self.ma,
                               separator=', ',
                               formatter={'float': hex})
        assert out4 == out1

    def test_array_repr(self):
        out = np.array_repr(self.ma)
        assert out == 'MaskedNDArray([—, 1, 2])'
        ma2 = self.ma.astype('f4')
        out2 = np.array_repr(ma2)
        assert out2 == 'MaskedNDArray([——, 1., 2.], dtype=float32)'

    def test_array_str(self):
        out = np.array_str(self.ma)
        assert out == '[— 1 2]'
 def setup_class(self):
     self.a = np.arange(54.).reshape(3, 3, 6)
     self.mask_a = np.zeros(self.a.shape, dtype=bool)
     self.mask_a[1, 1, 1] = True
     self.mask_a[0, 1, 4] = True
     self.mask_a[1, 2, 5] = True
     self.ma = Masked(self.a, mask=self.mask_a)