136 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								.. -*- 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).
							 |