Blame numpy/ma/tests/test_mrecords.py

Packit 7a8e5e
# pylint: disable-msg=W0611, W0612, W0511,R0201
Packit 7a8e5e
"""Tests suite for mrecords.
Packit 7a8e5e
Packit 7a8e5e
:author: Pierre Gerard-Marchant
Packit 7a8e5e
:contact: pierregm_at_uga_dot_edu
Packit 7a8e5e
Packit 7a8e5e
"""
Packit 7a8e5e
from __future__ import division, absolute_import, print_function
Packit 7a8e5e
Packit 7a8e5e
import warnings
Packit 7a8e5e
import pickle
Packit 7a8e5e
Packit 7a8e5e
import numpy as np
Packit 7a8e5e
import numpy.ma as ma
Packit 7a8e5e
from numpy import recarray
Packit 7a8e5e
from numpy.ma import masked, nomask
Packit 7a8e5e
from numpy.testing import run_module_suite, temppath
Packit 7a8e5e
from numpy.core.records import (
Packit 7a8e5e
    fromrecords as recfromrecords, fromarrays as recfromarrays
Packit 7a8e5e
    )
Packit 7a8e5e
from numpy.ma.mrecords import (
Packit 7a8e5e
    MaskedRecords, mrecarray, fromarrays, fromtextfile, fromrecords,
Packit 7a8e5e
    addfield
Packit 7a8e5e
    )
Packit 7a8e5e
from numpy.ma.testutils import (
Packit 7a8e5e
    assert_, assert_equal,
Packit 7a8e5e
    assert_equal_records,
Packit 7a8e5e
    )
Packit 7a8e5e
Packit 7a8e5e
Packit 7a8e5e
class TestMRecords(object):
Packit 7a8e5e
Packit 7a8e5e
    ilist = [1, 2, 3, 4, 5]
Packit 7a8e5e
    flist = [1.1, 2.2, 3.3, 4.4, 5.5]
Packit 7a8e5e
    slist = [b'one', b'two', b'three', b'four', b'five']
Packit 7a8e5e
    ddtype = [('a', int), ('b', float), ('c', '|S8')]
Packit 7a8e5e
    mask = [0, 1, 0, 0, 1]
Packit 7a8e5e
    base = ma.array(list(zip(ilist, flist, slist)), mask=mask, dtype=ddtype)
Packit 7a8e5e
Packit 7a8e5e
    def test_byview(self):
Packit 7a8e5e
        # Test creation by view
Packit 7a8e5e
        base = self.base
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        assert_equal(mbase.recordmask, base.recordmask)
Packit 7a8e5e
        assert_equal_records(mbase._mask, base._mask)
Packit 7a8e5e
        assert_(isinstance(mbase._data, recarray))
Packit 7a8e5e
        assert_equal_records(mbase._data, base._data.view(recarray))
Packit 7a8e5e
        for field in ('a', 'b', 'c'):
Packit 7a8e5e
            assert_equal(base[field], mbase[field])
Packit 7a8e5e
        assert_equal_records(mbase.view(mrecarray), mbase)
Packit 7a8e5e
Packit 7a8e5e
    def test_get(self):
Packit 7a8e5e
        # Tests fields retrieval
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        # As fields..........
Packit 7a8e5e
        for field in ('a', 'b', 'c'):
Packit 7a8e5e
            assert_equal(getattr(mbase, field), mbase[field])
Packit 7a8e5e
            assert_equal(base[field], mbase[field])
Packit 7a8e5e
        # as elements .......
Packit 7a8e5e
        mbase_first = mbase[0]
Packit 7a8e5e
        assert_(isinstance(mbase_first, mrecarray))
Packit 7a8e5e
        assert_equal(mbase_first.dtype, mbase.dtype)
Packit 7a8e5e
        assert_equal(mbase_first.tolist(), (1, 1.1, b'one'))
Packit 7a8e5e
        # Used to be mask, now it's recordmask
Packit 7a8e5e
        assert_equal(mbase_first.recordmask, nomask)
Packit 7a8e5e
        assert_equal(mbase_first._mask.item(), (False, False, False))
Packit 7a8e5e
        assert_equal(mbase_first['a'], mbase['a'][0])
Packit 7a8e5e
        mbase_last = mbase[-1]
Packit 7a8e5e
        assert_(isinstance(mbase_last, mrecarray))
Packit 7a8e5e
        assert_equal(mbase_last.dtype, mbase.dtype)
Packit 7a8e5e
        assert_equal(mbase_last.tolist(), (None, None, None))
Packit 7a8e5e
        # Used to be mask, now it's recordmask
Packit 7a8e5e
        assert_equal(mbase_last.recordmask, True)
Packit 7a8e5e
        assert_equal(mbase_last._mask.item(), (True, True, True))
Packit 7a8e5e
        assert_equal(mbase_last['a'], mbase['a'][-1])
Packit 7a8e5e
        assert_((mbase_last['a'] is masked))
Packit 7a8e5e
        # as slice ..........
Packit 7a8e5e
        mbase_sl = mbase[:2]
Packit 7a8e5e
        assert_(isinstance(mbase_sl, mrecarray))
Packit 7a8e5e
        assert_equal(mbase_sl.dtype, mbase.dtype)
Packit 7a8e5e
        # Used to be mask, now it's recordmask
Packit 7a8e5e
        assert_equal(mbase_sl.recordmask, [0, 1])
Packit 7a8e5e
        assert_equal_records(mbase_sl.mask,
Packit 7a8e5e
                             np.array([(False, False, False),
Packit 7a8e5e
                                       (True, True, True)],
Packit 7a8e5e
                                      dtype=mbase._mask.dtype))
Packit 7a8e5e
        assert_equal_records(mbase_sl, base[:2].view(mrecarray))
Packit 7a8e5e
        for field in ('a', 'b', 'c'):
Packit 7a8e5e
            assert_equal(getattr(mbase_sl, field), base[:2][field])
Packit 7a8e5e
Packit 7a8e5e
    def test_set_fields(self):
Packit 7a8e5e
        # Tests setting fields.
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        mbase = mbase.copy()
Packit 7a8e5e
        mbase.fill_value = (999999, 1e20, 'N/A')
Packit 7a8e5e
        # Change the data, the mask should be conserved
Packit 7a8e5e
        mbase.a._data[:] = 5
Packit 7a8e5e
        assert_equal(mbase['a']._data, [5, 5, 5, 5, 5])
Packit 7a8e5e
        assert_equal(mbase['a']._mask, [0, 1, 0, 0, 1])
Packit 7a8e5e
        # Change the elements, and the mask will follow
Packit 7a8e5e
        mbase.a = 1
Packit 7a8e5e
        assert_equal(mbase['a']._data, [1]*5)
Packit 7a8e5e
        assert_equal(ma.getmaskarray(mbase['a']), [0]*5)
Packit 7a8e5e
        # Use to be _mask, now it's recordmask
Packit 7a8e5e
        assert_equal(mbase.recordmask, [False]*5)
Packit 7a8e5e
        assert_equal(mbase._mask.tolist(),
Packit 7a8e5e
                     np.array([(0, 0, 0),
Packit 7a8e5e
                               (0, 1, 1),
Packit 7a8e5e
                               (0, 0, 0),
Packit 7a8e5e
                               (0, 0, 0),
Packit 7a8e5e
                               (0, 1, 1)],
Packit 7a8e5e
                              dtype=bool))
Packit 7a8e5e
        # Set a field to mask ........................
Packit 7a8e5e
        mbase.c = masked
Packit 7a8e5e
        # Use to be mask, and now it's still mask !
Packit 7a8e5e
        assert_equal(mbase.c.mask, [1]*5)
Packit 7a8e5e
        assert_equal(mbase.c.recordmask, [1]*5)
Packit 7a8e5e
        assert_equal(ma.getmaskarray(mbase['c']), [1]*5)
Packit 7a8e5e
        assert_equal(ma.getdata(mbase['c']), [b'N/A']*5)
Packit 7a8e5e
        assert_equal(mbase._mask.tolist(),
Packit 7a8e5e
                     np.array([(0, 0, 1),
Packit 7a8e5e
                               (0, 1, 1),
Packit 7a8e5e
                               (0, 0, 1),
Packit 7a8e5e
                               (0, 0, 1),
Packit 7a8e5e
                               (0, 1, 1)],
Packit 7a8e5e
                              dtype=bool))
Packit 7a8e5e
        # Set fields by slices .......................
Packit 7a8e5e
        mbase = base.view(mrecarray).copy()
Packit 7a8e5e
        mbase.a[3:] = 5
Packit 7a8e5e
        assert_equal(mbase.a, [1, 2, 3, 5, 5])
Packit 7a8e5e
        assert_equal(mbase.a._mask, [0, 1, 0, 0, 0])
Packit 7a8e5e
        mbase.b[3:] = masked
Packit 7a8e5e
        assert_equal(mbase.b, base['b'])
Packit 7a8e5e
        assert_equal(mbase.b._mask, [0, 1, 0, 1, 1])
Packit 7a8e5e
        # Set fields globally..........................
Packit 7a8e5e
        ndtype = [('alpha', '|S1'), ('num', int)]
Packit 7a8e5e
        data = ma.array([('a', 1), ('b', 2), ('c', 3)], dtype=ndtype)
Packit 7a8e5e
        rdata = data.view(MaskedRecords)
Packit 7a8e5e
        val = ma.array([10, 20, 30], mask=[1, 0, 0])
Packit 7a8e5e
Packit 7a8e5e
        rdata['num'] = val
Packit 7a8e5e
        assert_equal(rdata.num, val)
Packit 7a8e5e
        assert_equal(rdata.num.mask, [1, 0, 0])
Packit 7a8e5e
Packit 7a8e5e
    def test_set_fields_mask(self):
Packit 7a8e5e
        # Tests setting the mask of a field.
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        # This one has already a mask....
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        mbase['a'][-2] = masked
Packit 7a8e5e
        assert_equal(mbase.a, [1, 2, 3, 4, 5])
Packit 7a8e5e
        assert_equal(mbase.a._mask, [0, 1, 0, 1, 1])
Packit 7a8e5e
        # This one has not yet
Packit 7a8e5e
        mbase = fromarrays([np.arange(5), np.random.rand(5)],
Packit 7a8e5e
                           dtype=[('a', int), ('b', float)])
Packit 7a8e5e
        mbase['a'][-2] = masked
Packit 7a8e5e
        assert_equal(mbase.a, [0, 1, 2, 3, 4])
Packit 7a8e5e
        assert_equal(mbase.a._mask, [0, 0, 0, 1, 0])
Packit 7a8e5e
Packit 7a8e5e
    def test_set_mask(self):
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        # Set the mask to True .......................
Packit 7a8e5e
        mbase.mask = masked
Packit 7a8e5e
        assert_equal(ma.getmaskarray(mbase['b']), [1]*5)
Packit 7a8e5e
        assert_equal(mbase['a']._mask, mbase['b']._mask)
Packit 7a8e5e
        assert_equal(mbase['a']._mask, mbase['c']._mask)
Packit 7a8e5e
        assert_equal(mbase._mask.tolist(),
Packit 7a8e5e
                     np.array([(1, 1, 1)]*5, dtype=bool))
Packit 7a8e5e
        # Delete the mask ............................
Packit 7a8e5e
        mbase.mask = nomask
Packit 7a8e5e
        assert_equal(ma.getmaskarray(mbase['c']), [0]*5)
Packit 7a8e5e
        assert_equal(mbase._mask.tolist(),
Packit 7a8e5e
                     np.array([(0, 0, 0)]*5, dtype=bool))
Packit 7a8e5e
Packit 7a8e5e
    def test_set_mask_fromarray(self):
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        # Sets the mask w/ an array
Packit 7a8e5e
        mbase.mask = [1, 0, 0, 0, 1]
Packit 7a8e5e
        assert_equal(mbase.a.mask, [1, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.b.mask, [1, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.c.mask, [1, 0, 0, 0, 1])
Packit 7a8e5e
        # Yay, once more !
Packit 7a8e5e
        mbase.mask = [0, 0, 0, 0, 1]
Packit 7a8e5e
        assert_equal(mbase.a.mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.b.mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.c.mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
Packit 7a8e5e
    def test_set_mask_fromfields(self):
Packit 7a8e5e
        mbase = self.base.copy().view(mrecarray)
Packit 7a8e5e
Packit 7a8e5e
        nmask = np.array(
Packit 7a8e5e
            [(0, 1, 0), (0, 1, 0), (1, 0, 1), (1, 0, 1), (0, 0, 0)],
Packit 7a8e5e
            dtype=[('a', bool), ('b', bool), ('c', bool)])
Packit 7a8e5e
        mbase.mask = nmask
Packit 7a8e5e
        assert_equal(mbase.a.mask, [0, 0, 1, 1, 0])
Packit 7a8e5e
        assert_equal(mbase.b.mask, [1, 1, 0, 0, 0])
Packit 7a8e5e
        assert_equal(mbase.c.mask, [0, 0, 1, 1, 0])
Packit 7a8e5e
        # Reinitialize and redo
Packit 7a8e5e
        mbase.mask = False
Packit 7a8e5e
        mbase.fieldmask = nmask
Packit 7a8e5e
        assert_equal(mbase.a.mask, [0, 0, 1, 1, 0])
Packit 7a8e5e
        assert_equal(mbase.b.mask, [1, 1, 0, 0, 0])
Packit 7a8e5e
        assert_equal(mbase.c.mask, [0, 0, 1, 1, 0])
Packit 7a8e5e
Packit 7a8e5e
    def test_set_elements(self):
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        # Set an element to mask .....................
Packit 7a8e5e
        mbase = base.view(mrecarray).copy()
Packit 7a8e5e
        mbase[-2] = masked
Packit 7a8e5e
        assert_equal(
Packit 7a8e5e
            mbase._mask.tolist(),
Packit 7a8e5e
            np.array([(0, 0, 0), (1, 1, 1), (0, 0, 0), (1, 1, 1), (1, 1, 1)],
Packit 7a8e5e
                     dtype=bool))
Packit 7a8e5e
        # Used to be mask, now it's recordmask!
Packit 7a8e5e
        assert_equal(mbase.recordmask, [0, 1, 0, 1, 1])
Packit 7a8e5e
        # Set slices .................................
Packit 7a8e5e
        mbase = base.view(mrecarray).copy()
Packit 7a8e5e
        mbase[:2] = (5, 5, 5)
Packit 7a8e5e
        assert_equal(mbase.a._data, [5, 5, 3, 4, 5])
Packit 7a8e5e
        assert_equal(mbase.a._mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.b._data, [5., 5., 3.3, 4.4, 5.5])
Packit 7a8e5e
        assert_equal(mbase.b._mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.c._data,
Packit 7a8e5e
                     [b'5', b'5', b'three', b'four', b'five'])
Packit 7a8e5e
        assert_equal(mbase.b._mask, [0, 0, 0, 0, 1])
Packit 7a8e5e
Packit 7a8e5e
        mbase = base.view(mrecarray).copy()
Packit 7a8e5e
        mbase[:2] = masked
Packit 7a8e5e
        assert_equal(mbase.a._data, [1, 2, 3, 4, 5])
Packit 7a8e5e
        assert_equal(mbase.a._mask, [1, 1, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.b._data, [1.1, 2.2, 3.3, 4.4, 5.5])
Packit 7a8e5e
        assert_equal(mbase.b._mask, [1, 1, 0, 0, 1])
Packit 7a8e5e
        assert_equal(mbase.c._data,
Packit 7a8e5e
                     [b'one', b'two', b'three', b'four', b'five'])
Packit 7a8e5e
        assert_equal(mbase.b._mask, [1, 1, 0, 0, 1])
Packit 7a8e5e
Packit 7a8e5e
    def test_setslices_hardmask(self):
Packit 7a8e5e
        # Tests setting slices w/ hardmask.
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        mbase.harden_mask()
Packit 7a8e5e
        try:
Packit 7a8e5e
            mbase[-2:] = (5, 5, 5)
Packit 7a8e5e
            assert_equal(mbase.a._data, [1, 2, 3, 5, 5])
Packit 7a8e5e
            assert_equal(mbase.b._data, [1.1, 2.2, 3.3, 5, 5.5])
Packit 7a8e5e
            assert_equal(mbase.c._data,
Packit 7a8e5e
                         [b'one', b'two', b'three', b'5', b'five'])
Packit 7a8e5e
            assert_equal(mbase.a._mask, [0, 1, 0, 0, 1])
Packit 7a8e5e
            assert_equal(mbase.b._mask, mbase.a._mask)
Packit 7a8e5e
            assert_equal(mbase.b._mask, mbase.c._mask)
Packit 7a8e5e
        except NotImplementedError:
Packit 7a8e5e
            # OK, not implemented yet...
Packit 7a8e5e
            pass
Packit 7a8e5e
        except AssertionError:
Packit 7a8e5e
            raise
Packit 7a8e5e
        else:
Packit 7a8e5e
            raise Exception("Flexible hard masks should be supported !")
Packit 7a8e5e
        # Not using a tuple should crash
Packit 7a8e5e
        try:
Packit 7a8e5e
            mbase[-2:] = 3
Packit 7a8e5e
        except (NotImplementedError, TypeError):
Packit 7a8e5e
            pass
Packit 7a8e5e
        else:
Packit 7a8e5e
            raise TypeError("Should have expected a readable buffer object!")
Packit 7a8e5e
Packit 7a8e5e
    def test_hardmask(self):
Packit 7a8e5e
        # Test hardmask
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mbase = base.view(mrecarray)
Packit 7a8e5e
        mbase.harden_mask()
Packit 7a8e5e
        assert_(mbase._hardmask)
Packit 7a8e5e
        mbase.mask = nomask
Packit 7a8e5e
        assert_equal_records(mbase._mask, base._mask)
Packit 7a8e5e
        mbase.soften_mask()
Packit 7a8e5e
        assert_(not mbase._hardmask)
Packit 7a8e5e
        mbase.mask = nomask
Packit 7a8e5e
        # So, the mask of a field is no longer set to nomask...
Packit 7a8e5e
        assert_equal_records(mbase._mask,
Packit 7a8e5e
                             ma.make_mask_none(base.shape, base.dtype))
Packit 7a8e5e
        assert_(ma.make_mask(mbase['b']._mask) is nomask)
Packit 7a8e5e
        assert_equal(mbase['a']._mask, mbase['b']._mask)
Packit 7a8e5e
Packit 7a8e5e
    def test_pickling(self):
Packit 7a8e5e
        # Test pickling
Packit 7a8e5e
        base = self.base.copy()
Packit 7a8e5e
        mrec = base.view(mrecarray)
Packit 7a8e5e
        _ = pickle.dumps(mrec)
Packit 7a8e5e
        mrec_ = pickle.loads(_)
Packit 7a8e5e
        assert_equal(mrec_.dtype, mrec.dtype)
Packit 7a8e5e
        assert_equal_records(mrec_._data, mrec._data)
Packit 7a8e5e
        assert_equal(mrec_._mask, mrec._mask)
Packit 7a8e5e
        assert_equal_records(mrec_._mask, mrec._mask)
Packit 7a8e5e
Packit 7a8e5e
    def test_filled(self):
Packit 7a8e5e
        # Test filling the array
Packit 7a8e5e
        _a = ma.array([1, 2, 3], mask=[0, 0, 1], dtype=int)
Packit 7a8e5e
        _b = ma.array([1.1, 2.2, 3.3], mask=[0, 0, 1], dtype=float)
Packit 7a8e5e
        _c = ma.array(['one', 'two', 'three'], mask=[0, 0, 1], dtype='|S8')
Packit 7a8e5e
        ddtype = [('a', int), ('b', float), ('c', '|S8')]
Packit 7a8e5e
        mrec = fromarrays([_a, _b, _c], dtype=ddtype,
Packit 7a8e5e
                          fill_value=(99999, 99999., 'N/A'))
Packit 7a8e5e
        mrecfilled = mrec.filled()
Packit 7a8e5e
        assert_equal(mrecfilled['a'], np.array((1, 2, 99999), dtype=int))
Packit 7a8e5e
        assert_equal(mrecfilled['b'], np.array((1.1, 2.2, 99999.),
Packit 7a8e5e
                                               dtype=float))
Packit 7a8e5e
        assert_equal(mrecfilled['c'], np.array(('one', 'two', 'N/A'),
Packit 7a8e5e
                                               dtype='|S8'))
Packit 7a8e5e
Packit 7a8e5e
    def test_tolist(self):
Packit 7a8e5e
        # Test tolist.
Packit 7a8e5e
        _a = ma.array([1, 2, 3], mask=[0, 0, 1], dtype=int)
Packit 7a8e5e
        _b = ma.array([1.1, 2.2, 3.3], mask=[0, 0, 1], dtype=float)
Packit 7a8e5e
        _c = ma.array(['one', 'two', 'three'], mask=[1, 0, 0], dtype='|S8')
Packit 7a8e5e
        ddtype = [('a', int), ('b', float), ('c', '|S8')]
Packit 7a8e5e
        mrec = fromarrays([_a, _b, _c], dtype=ddtype,
Packit 7a8e5e
                          fill_value=(99999, 99999., 'N/A'))
Packit 7a8e5e
Packit 7a8e5e
        assert_equal(mrec.tolist(),
Packit 7a8e5e
                     [(1, 1.1, None), (2, 2.2, b'two'),
Packit 7a8e5e
                      (None, None, b'three')])
Packit 7a8e5e
Packit 7a8e5e
    def test_withnames(self):
Packit 7a8e5e
        # Test the creation w/ format and names
Packit 7a8e5e
        x = mrecarray(1, formats=float, names='base')
Packit 7a8e5e
        x[0]['base'] = 10
Packit 7a8e5e
        assert_equal(x['base'][0], 10)
Packit 7a8e5e
Packit 7a8e5e
    def test_exotic_formats(self):
Packit 7a8e5e
        # Test that 'exotic' formats are processed properly
Packit 7a8e5e
        easy = mrecarray(1, dtype=[('i', int), ('s', '|S8'), ('f', float)])
Packit 7a8e5e
        easy[0] = masked
Packit 7a8e5e
        assert_equal(easy.filled(1).item(), (1, b'1', 1.))
Packit 7a8e5e
Packit 7a8e5e
        solo = mrecarray(1, dtype=[('f0', '
Packit 7a8e5e
        solo[0] = masked
Packit 7a8e5e
        assert_equal(solo.filled(1).item(),
Packit 7a8e5e
                     np.array((1,), dtype=solo.dtype).item())
Packit 7a8e5e
Packit 7a8e5e
        mult = mrecarray(2, dtype="i4, (2,3)float, float")
Packit 7a8e5e
        mult[0] = masked
Packit 7a8e5e
        mult[1] = (1, 1, 1)
Packit 7a8e5e
        mult.filled(0)
Packit 7a8e5e
        assert_equal_records(mult.filled(0),
Packit 7a8e5e
                             np.array([(0, 0, 0), (1, 1, 1)],
Packit 7a8e5e
                                      dtype=mult.dtype))
Packit 7a8e5e
Packit 7a8e5e
Packit 7a8e5e
class TestView(object):
Packit 7a8e5e
Packit 7a8e5e
    def setup(self):
Packit 7a8e5e
        (a, b) = (np.arange(10), np.random.rand(10))
Packit 7a8e5e
        ndtype = [('a', float), ('b', float)]
Packit 7a8e5e
        arr = np.array(list(zip(a, b)), dtype=ndtype)
Packit 7a8e5e
Packit 7a8e5e
        mrec = fromarrays([a, b], dtype=ndtype, fill_value=(-9., -99.))
Packit 7a8e5e
        mrec.mask[3] = (False, True)
Packit 7a8e5e
        self.data = (mrec, a, b, arr)
Packit 7a8e5e
Packit 7a8e5e
    def test_view_by_itself(self):
Packit 7a8e5e
        (mrec, a, b, arr) = self.data
Packit 7a8e5e
        test = mrec.view()
Packit 7a8e5e
        assert_(isinstance(test, MaskedRecords))
Packit 7a8e5e
        assert_equal_records(test, mrec)
Packit 7a8e5e
        assert_equal_records(test._mask, mrec._mask)
Packit 7a8e5e
Packit 7a8e5e
    def test_view_simple_dtype(self):
Packit 7a8e5e
        (mrec, a, b, arr) = self.data
Packit 7a8e5e
        ntype = (float, 2)
Packit 7a8e5e
        test = mrec.view(ntype)
Packit 7a8e5e
        assert_(isinstance(test, ma.MaskedArray))
Packit 7a8e5e
        assert_equal(test, np.array(list(zip(a, b)), dtype=float))
Packit 7a8e5e
        assert_(test[3, 1] is ma.masked)
Packit 7a8e5e
Packit 7a8e5e
    def test_view_flexible_type(self):
Packit 7a8e5e
        (mrec, a, b, arr) = self.data
Packit 7a8e5e
        alttype = [('A', float), ('B', float)]
Packit 7a8e5e
        test = mrec.view(alttype)
Packit 7a8e5e
        assert_(isinstance(test, MaskedRecords))
Packit 7a8e5e
        assert_equal_records(test, arr.view(alttype))
Packit 7a8e5e
        assert_(test['B'][3] is masked)
Packit 7a8e5e
        assert_equal(test.dtype, np.dtype(alttype))
Packit 7a8e5e
        assert_(test._fill_value is None)
Packit 7a8e5e
Packit 7a8e5e
Packit 7a8e5e
##############################################################################
Packit 7a8e5e
class TestMRecordsImport(object):
Packit 7a8e5e
Packit 7a8e5e
    _a = ma.array([1, 2, 3], mask=[0, 0, 1], dtype=int)
Packit 7a8e5e
    _b = ma.array([1.1, 2.2, 3.3], mask=[0, 0, 1], dtype=float)
Packit 7a8e5e
    _c = ma.array([b'one', b'two', b'three'],
Packit 7a8e5e
                  mask=[0, 0, 1], dtype='|S8')
Packit 7a8e5e
    ddtype = [('a', int), ('b', float), ('c', '|S8')]
Packit 7a8e5e
    mrec = fromarrays([_a, _b, _c], dtype=ddtype,
Packit 7a8e5e
                      fill_value=(b'99999', b'99999.',
Packit 7a8e5e
                                  b'N/A'))
Packit 7a8e5e
    nrec = recfromarrays((_a._data, _b._data, _c._data), dtype=ddtype)
Packit 7a8e5e
    data = (mrec, nrec, ddtype)
Packit 7a8e5e
Packit 7a8e5e
    def test_fromarrays(self):
Packit 7a8e5e
        _a = ma.array([1, 2, 3], mask=[0, 0, 1], dtype=int)
Packit 7a8e5e
        _b = ma.array([1.1, 2.2, 3.3], mask=[0, 0, 1], dtype=float)
Packit 7a8e5e
        _c = ma.array(['one', 'two', 'three'], mask=[0, 0, 1], dtype='|S8')
Packit 7a8e5e
        (mrec, nrec, _) = self.data
Packit 7a8e5e
        for (f, l) in zip(('a', 'b', 'c'), (_a, _b, _c)):
Packit 7a8e5e
            assert_equal(getattr(mrec, f)._mask, l._mask)
Packit 7a8e5e
        # One record only
Packit 7a8e5e
        _x = ma.array([1, 1.1, 'one'], mask=[1, 0, 0],)
Packit 7a8e5e
        assert_equal_records(fromarrays(_x, dtype=mrec.dtype), mrec[0])
Packit 7a8e5e
Packit 7a8e5e
    def test_fromrecords(self):
Packit 7a8e5e
        # Test construction from records.
Packit 7a8e5e
        (mrec, nrec, ddtype) = self.data
Packit 7a8e5e
        #......
Packit 7a8e5e
        palist = [(1, 'abc', 3.7000002861022949, 0),
Packit 7a8e5e
                  (2, 'xy', 6.6999998092651367, 1),
Packit 7a8e5e
                  (0, ' ', 0.40000000596046448, 0)]
Packit 7a8e5e
        pa = recfromrecords(palist, names='c1, c2, c3, c4')
Packit 7a8e5e
        mpa = fromrecords(palist, names='c1, c2, c3, c4')
Packit 7a8e5e
        assert_equal_records(pa, mpa)
Packit 7a8e5e
        #.....
Packit 7a8e5e
        _mrec = fromrecords(nrec)
Packit 7a8e5e
        assert_equal(_mrec.dtype, mrec.dtype)
Packit 7a8e5e
        for field in _mrec.dtype.names:
Packit 7a8e5e
            assert_equal(getattr(_mrec, field), getattr(mrec._data, field))
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(nrec.tolist(), names='c1,c2,c3')
Packit 7a8e5e
        assert_equal(_mrec.dtype, [('c1', int), ('c2', float), ('c3', '|S5')])
Packit 7a8e5e
        for (f, n) in zip(('c1', 'c2', 'c3'), ('a', 'b', 'c')):
Packit 7a8e5e
            assert_equal(getattr(_mrec, f), getattr(mrec._data, n))
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(mrec)
Packit 7a8e5e
        assert_equal(_mrec.dtype, mrec.dtype)
Packit 7a8e5e
        assert_equal_records(_mrec._data, mrec.filled())
Packit 7a8e5e
        assert_equal_records(_mrec._mask, mrec._mask)
Packit 7a8e5e
Packit 7a8e5e
    def test_fromrecords_wmask(self):
Packit 7a8e5e
        # Tests construction from records w/ mask.
Packit 7a8e5e
        (mrec, nrec, ddtype) = self.data
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(nrec.tolist(), dtype=ddtype, mask=[0, 1, 0,])
Packit 7a8e5e
        assert_equal_records(_mrec._data, mrec._data)
Packit 7a8e5e
        assert_equal(_mrec._mask.tolist(), [(0, 0, 0), (1, 1, 1), (0, 0, 0)])
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(nrec.tolist(), dtype=ddtype, mask=True)
Packit 7a8e5e
        assert_equal_records(_mrec._data, mrec._data)
Packit 7a8e5e
        assert_equal(_mrec._mask.tolist(), [(1, 1, 1), (1, 1, 1), (1, 1, 1)])
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(nrec.tolist(), dtype=ddtype, mask=mrec._mask)
Packit 7a8e5e
        assert_equal_records(_mrec._data, mrec._data)
Packit 7a8e5e
        assert_equal(_mrec._mask.tolist(), mrec._mask.tolist())
Packit 7a8e5e
Packit 7a8e5e
        _mrec = fromrecords(nrec.tolist(), dtype=ddtype,
Packit 7a8e5e
                            mask=mrec._mask.tolist())
Packit 7a8e5e
        assert_equal_records(_mrec._data, mrec._data)
Packit 7a8e5e
        assert_equal(_mrec._mask.tolist(), mrec._mask.tolist())
Packit 7a8e5e
Packit 7a8e5e
    def test_fromtextfile(self):
Packit 7a8e5e
        # Tests reading from a text file.
Packit 7a8e5e
        fcontent = (
Packit 7a8e5e
"""#
Packit 7a8e5e
'One (S)','Two (I)','Three (F)','Four (M)','Five (-)','Six (C)'
Packit 7a8e5e
'strings',1,1.0,'mixed column',,1
Packit 7a8e5e
'with embedded "double quotes"',2,2.0,1.0,,1
Packit 7a8e5e
'strings',3,3.0E5,3,,1
Packit 7a8e5e
'strings',4,-1e-10,,,1
Packit 7a8e5e
""")
Packit 7a8e5e
        with temppath() as path:
Packit 7a8e5e
            with open(path, 'w') as f:
Packit 7a8e5e
                f.write(fcontent)
Packit 7a8e5e
            mrectxt = fromtextfile(path, delimitor=',', varnames='ABCDEFG')
Packit 7a8e5e
        assert_(isinstance(mrectxt, MaskedRecords))
Packit 7a8e5e
        assert_equal(mrectxt.F, [1, 1, 1, 1])
Packit 7a8e5e
        assert_equal(mrectxt.E._mask, [1, 1, 1, 1])
Packit 7a8e5e
        assert_equal(mrectxt.C, [1, 2, 3.e+5, -1e-10])
Packit 7a8e5e
Packit 7a8e5e
    def test_addfield(self):
Packit 7a8e5e
        # Tests addfield
Packit 7a8e5e
        (mrec, nrec, ddtype) = self.data
Packit 7a8e5e
        (d, m) = ([100, 200, 300], [1, 0, 0])
Packit 7a8e5e
        mrec = addfield(mrec, ma.array(d, mask=m))
Packit 7a8e5e
        assert_equal(mrec.f3, d)
Packit 7a8e5e
        assert_equal(mrec.f3._mask, m)
Packit 7a8e5e
Packit 7a8e5e
Packit 7a8e5e
def test_record_array_with_object_field():
Packit 7a8e5e
    # Trac #1839
Packit 7a8e5e
    y = ma.masked_array(
Packit 7a8e5e
        [(1, '2'), (3, '4')],
Packit 7a8e5e
        mask=[(0, 0), (0, 1)],
Packit 7a8e5e
        dtype=[('a', int), ('b', object)])
Packit 7a8e5e
    # getting an item used to fail
Packit 7a8e5e
    y[1]
Packit 7a8e5e
Packit 7a8e5e
Packit 7a8e5e
if __name__ == "__main__":
Packit 7a8e5e
    run_module_suite()