|
.. -*- rest -*- |
|
|
|
================================================== |
|
API changes in the new masked array implementation |
|
================================================== |
|
|
|
Masked arrays are subclasses of ndarray |
|
--------------------------------------- |
|
|
|
Contrary to the original implementation, masked arrays are now regular |
|
ndarrays:: |
|
|
|
>>> x = masked_array([1,2,3],mask=[0,0,1]) |
|
>>> print isinstance(x, numpy.ndarray) |
|
True |
|
|
|
|
|
``_data`` returns a view of the masked array |
|
-------------------------------------------- |
|
|
|
Masked arrays are composed of a ``_data`` part and a ``_mask``. Accessing the |
|
``_data`` part will return a regular ndarray or any of its subclass, depending |
|
on the initial data:: |
|
|
|
>>> x = masked_array(numpy.matrix([[1,2],[3,4]]),mask=[[0,0],[0,1]]) |
|
>>> print x._data |
|
[[1 2] |
|
[3 4]] |
|
>>> print type(x._data) |
|
<class 'numpy.matrixlib.defmatrix.matrix'> |
|
|
|
|
|
In practice, ``_data`` is implemented as a property, not as an attribute. |
|
Therefore, you cannot access it directly, and some simple tests such as the |
|
following one will fail:: |
|
|
|
>>>x._data is x._data |
|
False |
|
|
|
|
|
``filled(x)`` can return a subclass of ndarray |
|
---------------------------------------------- |
|
The function ``filled(a)`` returns an array of the same type as ``a._data``:: |
|
|
|
>>> x = masked_array(numpy.matrix([[1,2],[3,4]]),mask=[[0,0],[0,1]]) |
|
>>> y = filled(x) |
|
>>> print type(y) |
|
<class 'numpy.matrixlib.defmatrix.matrix'> |
|
>>> print y |
|
matrix([[ 1, 2], |
|
[ 3, 999999]]) |
|
|
|
|
|
``put``, ``putmask`` behave like their ndarray counterparts |
|
----------------------------------------------------------- |
|
|
|
Previously, ``putmask`` was used like this:: |
|
|
|
mask = [False,True,True] |
|
x = array([1,4,7],mask=mask) |
|
putmask(x,mask,[3]) |
|
|
|
which translated to:: |
|
|
|
x[~mask] = [3] |
|
|
|
(Note that a ``True``-value in a mask suppresses a value.) |
|
|
|
In other words, the mask had the same length as ``x``, whereas |
|
``values`` had ``sum(~mask)`` elements. |
|
|
|
Now, the behaviour is similar to that of ``ndarray.putmask``, where |
|
the mask and the values are both the same length as ``x``, i.e. |
|
|
|
:: |
|
|
|
putmask(x,mask,[3,0,0]) |
|
|
|
|
|
``fill_value`` is a property |
|
---------------------------- |
|
|
|
``fill_value`` is no longer a method, but a property:: |
|
|
|
>>> print x.fill_value |
|
999999 |
|
|
|
``cumsum`` and ``cumprod`` ignore missing values |
|
------------------------------------------------ |
|
|
|
Missing values are assumed to be the identity element, i.e. 0 for |
|
``cumsum`` and 1 for ``cumprod``:: |
|
|
|
>>> x = N.ma.array([1,2,3,4],mask=[False,True,False,False]) |
|
>>> print x |
|
[1 -- 3 4] |
|
>>> print x.cumsum() |
|
[1 -- 4 8] |
|
>> print x.cumprod() |
|
[1 -- 3 12] |
|
|
|
``bool(x)`` raises a ValueError |
|
------------------------------- |
|
|
|
Masked arrays now behave like regular ``ndarrays``, in that they cannot be |
|
converted to booleans: |
|
|
|
:: |
|
|
|
>>> x = N.ma.array([1,2,3]) |
|
>>> bool(x) |
|
Traceback (most recent call last): |
|
File "<stdin>", line 1, in <module> |
|
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() |
|
|
|
|
|
================================== |
|
New features (non exhaustive list) |
|
================================== |
|
|
|
``mr_`` |
|
------- |
|
|
|
``mr_`` mimics the behavior of ``r_`` for masked arrays:: |
|
|
|
>>> np.ma.mr_[3,4,5] |
|
masked_array(data = [3 4 5], |
|
mask = False, |
|
fill_value=999999) |
|
|
|
|
|
``anom`` |
|
-------- |
|
|
|
The ``anom`` method returns the deviations from the average (anomalies). |
|
|