You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			1120 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			1120 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Python
		
	
__all__ = ['matrix', 'bmat', 'asmatrix']
 | 
						|
 | 
						|
import ast
 | 
						|
import sys
 | 
						|
import warnings
 | 
						|
 | 
						|
import numpy._core.numeric as N
 | 
						|
from numpy._core.numeric import concatenate, isscalar
 | 
						|
from numpy._utils import set_module
 | 
						|
 | 
						|
# While not in __all__, matrix_power used to be defined here, so we import
 | 
						|
# it for backward compatibility.
 | 
						|
from numpy.linalg import matrix_power
 | 
						|
 | 
						|
 | 
						|
def _convert_from_string(data):
 | 
						|
    for char in '[]':
 | 
						|
        data = data.replace(char, '')
 | 
						|
 | 
						|
    rows = data.split(';')
 | 
						|
    newdata = []
 | 
						|
    for count, row in enumerate(rows):
 | 
						|
        trow = row.split(',')
 | 
						|
        newrow = []
 | 
						|
        for col in trow:
 | 
						|
            temp = col.split()
 | 
						|
            newrow.extend(map(ast.literal_eval, temp))
 | 
						|
        if count == 0:
 | 
						|
            Ncols = len(newrow)
 | 
						|
        elif len(newrow) != Ncols:
 | 
						|
            raise ValueError("Rows not the same size.")
 | 
						|
        newdata.append(newrow)
 | 
						|
    return newdata
 | 
						|
 | 
						|
 | 
						|
@set_module('numpy')
 | 
						|
def asmatrix(data, dtype=None):
 | 
						|
    """
 | 
						|
    Interpret the input as a matrix.
 | 
						|
 | 
						|
    Unlike `matrix`, `asmatrix` does not make a copy if the input is already
 | 
						|
    a matrix or an ndarray.  Equivalent to ``matrix(data, copy=False)``.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    data : array_like
 | 
						|
        Input data.
 | 
						|
    dtype : data-type
 | 
						|
       Data-type of the output matrix.
 | 
						|
 | 
						|
    Returns
 | 
						|
    -------
 | 
						|
    mat : matrix
 | 
						|
        `data` interpreted as a matrix.
 | 
						|
 | 
						|
    Examples
 | 
						|
    --------
 | 
						|
    >>> import numpy as np
 | 
						|
    >>> x = np.array([[1, 2], [3, 4]])
 | 
						|
 | 
						|
    >>> m = np.asmatrix(x)
 | 
						|
 | 
						|
    >>> x[0,0] = 5
 | 
						|
 | 
						|
    >>> m
 | 
						|
    matrix([[5, 2],
 | 
						|
            [3, 4]])
 | 
						|
 | 
						|
    """
 | 
						|
    return matrix(data, dtype=dtype, copy=False)
 | 
						|
 | 
						|
 | 
						|
@set_module('numpy')
 | 
						|
class matrix(N.ndarray):
 | 
						|
    """
 | 
						|
    matrix(data, dtype=None, copy=True)
 | 
						|
 | 
						|
    Returns a matrix from an array-like object, or from a string of data.
 | 
						|
 | 
						|
    A matrix is a specialized 2-D array that retains its 2-D nature
 | 
						|
    through operations.  It has certain special operators, such as ``*``
 | 
						|
    (matrix multiplication) and ``**`` (matrix power).
 | 
						|
 | 
						|
    .. note:: It is no longer recommended to use this class, even for linear
 | 
						|
              algebra. Instead use regular arrays. The class may be removed
 | 
						|
              in the future.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    data : array_like or string
 | 
						|
       If `data` is a string, it is interpreted as a matrix with commas
 | 
						|
       or spaces separating columns, and semicolons separating rows.
 | 
						|
    dtype : data-type
 | 
						|
       Data-type of the output matrix.
 | 
						|
    copy : bool
 | 
						|
       If `data` is already an `ndarray`, then this flag determines
 | 
						|
       whether the data is copied (the default), or whether a view is
 | 
						|
       constructed.
 | 
						|
 | 
						|
    See Also
 | 
						|
    --------
 | 
						|
    array
 | 
						|
 | 
						|
    Examples
 | 
						|
    --------
 | 
						|
    >>> import numpy as np
 | 
						|
    >>> a = np.matrix('1 2; 3 4')
 | 
						|
    >>> a
 | 
						|
    matrix([[1, 2],
 | 
						|
            [3, 4]])
 | 
						|
 | 
						|
    >>> np.matrix([[1, 2], [3, 4]])
 | 
						|
    matrix([[1, 2],
 | 
						|
            [3, 4]])
 | 
						|
 | 
						|
    """
 | 
						|
    __array_priority__ = 10.0
 | 
						|
 | 
						|
    def __new__(subtype, data, dtype=None, copy=True):
 | 
						|
        warnings.warn('the matrix subclass is not the recommended way to '
 | 
						|
                      'represent matrices or deal with linear algebra (see '
 | 
						|
                      'https://docs.scipy.org/doc/numpy/user/'
 | 
						|
                      'numpy-for-matlab-users.html). '
 | 
						|
                      'Please adjust your code to use regular ndarray.',
 | 
						|
                      PendingDeprecationWarning, stacklevel=2)
 | 
						|
        if isinstance(data, matrix):
 | 
						|
            dtype2 = data.dtype
 | 
						|
            if (dtype is None):
 | 
						|
                dtype = dtype2
 | 
						|
            if (dtype2 == dtype) and (not copy):
 | 
						|
                return data
 | 
						|
            return data.astype(dtype)
 | 
						|
 | 
						|
        if isinstance(data, N.ndarray):
 | 
						|
            if dtype is None:
 | 
						|
                intype = data.dtype
 | 
						|
            else:
 | 
						|
                intype = N.dtype(dtype)
 | 
						|
            new = data.view(subtype)
 | 
						|
            if intype != data.dtype:
 | 
						|
                return new.astype(intype)
 | 
						|
            if copy:
 | 
						|
                return new.copy()
 | 
						|
            else:
 | 
						|
                return new
 | 
						|
 | 
						|
        if isinstance(data, str):
 | 
						|
            data = _convert_from_string(data)
 | 
						|
 | 
						|
        # now convert data to an array
 | 
						|
        copy = None if not copy else True
 | 
						|
        arr = N.array(data, dtype=dtype, copy=copy)
 | 
						|
        ndim = arr.ndim
 | 
						|
        shape = arr.shape
 | 
						|
        if (ndim > 2):
 | 
						|
            raise ValueError("matrix must be 2-dimensional")
 | 
						|
        elif ndim == 0:
 | 
						|
            shape = (1, 1)
 | 
						|
        elif ndim == 1:
 | 
						|
            shape = (1, shape[0])
 | 
						|
 | 
						|
        order = 'C'
 | 
						|
        if (ndim == 2) and arr.flags.fortran:
 | 
						|
            order = 'F'
 | 
						|
 | 
						|
        if not (order or arr.flags.contiguous):
 | 
						|
            arr = arr.copy()
 | 
						|
 | 
						|
        ret = N.ndarray.__new__(subtype, shape, arr.dtype,
 | 
						|
                                buffer=arr,
 | 
						|
                                order=order)
 | 
						|
        return ret
 | 
						|
 | 
						|
    def __array_finalize__(self, obj):
 | 
						|
        self._getitem = False
 | 
						|
        if (isinstance(obj, matrix) and obj._getitem):
 | 
						|
            return
 | 
						|
        ndim = self.ndim
 | 
						|
        if (ndim == 2):
 | 
						|
            return
 | 
						|
        if (ndim > 2):
 | 
						|
            newshape = tuple(x for x in self.shape if x > 1)
 | 
						|
            ndim = len(newshape)
 | 
						|
            if ndim == 2:
 | 
						|
                self.shape = newshape
 | 
						|
                return
 | 
						|
            elif (ndim > 2):
 | 
						|
                raise ValueError("shape too large to be a matrix.")
 | 
						|
        else:
 | 
						|
            newshape = self.shape
 | 
						|
        if ndim == 0:
 | 
						|
            self.shape = (1, 1)
 | 
						|
        elif ndim == 1:
 | 
						|
            self.shape = (1, newshape[0])
 | 
						|
        return
 | 
						|
 | 
						|
    def __getitem__(self, index):
 | 
						|
        self._getitem = True
 | 
						|
 | 
						|
        try:
 | 
						|
            out = N.ndarray.__getitem__(self, index)
 | 
						|
        finally:
 | 
						|
            self._getitem = False
 | 
						|
 | 
						|
        if not isinstance(out, N.ndarray):
 | 
						|
            return out
 | 
						|
 | 
						|
        if out.ndim == 0:
 | 
						|
            return out[()]
 | 
						|
        if out.ndim == 1:
 | 
						|
            sh = out.shape[0]
 | 
						|
            # Determine when we should have a column array
 | 
						|
            try:
 | 
						|
                n = len(index)
 | 
						|
            except Exception:
 | 
						|
                n = 0
 | 
						|
            if n > 1 and isscalar(index[1]):
 | 
						|
                out.shape = (sh, 1)
 | 
						|
            else:
 | 
						|
                out.shape = (1, sh)
 | 
						|
        return out
 | 
						|
 | 
						|
    def __mul__(self, other):
 | 
						|
        if isinstance(other, (N.ndarray, list, tuple)):
 | 
						|
            # This promotes 1-D vectors to row vectors
 | 
						|
            return N.dot(self, asmatrix(other))
 | 
						|
        if isscalar(other) or not hasattr(other, '__rmul__'):
 | 
						|
            return N.dot(self, other)
 | 
						|
        return NotImplemented
 | 
						|
 | 
						|
    def __rmul__(self, other):
 | 
						|
        return N.dot(other, self)
 | 
						|
 | 
						|
    def __imul__(self, other):
 | 
						|
        self[:] = self * other
 | 
						|
        return self
 | 
						|
 | 
						|
    def __pow__(self, other):
 | 
						|
        return matrix_power(self, other)
 | 
						|
 | 
						|
    def __ipow__(self, other):
 | 
						|
        self[:] = self ** other
 | 
						|
        return self
 | 
						|
 | 
						|
    def __rpow__(self, other):
 | 
						|
        return NotImplemented
 | 
						|
 | 
						|
    def _align(self, axis):
 | 
						|
        """A convenience function for operations that need to preserve axis
 | 
						|
        orientation.
 | 
						|
        """
 | 
						|
        if axis is None:
 | 
						|
            return self[0, 0]
 | 
						|
        elif axis == 0:
 | 
						|
            return self
 | 
						|
        elif axis == 1:
 | 
						|
            return self.transpose()
 | 
						|
        else:
 | 
						|
            raise ValueError("unsupported axis")
 | 
						|
 | 
						|
    def _collapse(self, axis):
 | 
						|
        """A convenience function for operations that want to collapse
 | 
						|
        to a scalar like _align, but are using keepdims=True
 | 
						|
        """
 | 
						|
        if axis is None:
 | 
						|
            return self[0, 0]
 | 
						|
        else:
 | 
						|
            return self
 | 
						|
 | 
						|
    # Necessary because base-class tolist expects dimension
 | 
						|
    #  reduction by x[0]
 | 
						|
    def tolist(self):
 | 
						|
        """
 | 
						|
        Return the matrix as a (possibly nested) list.
 | 
						|
 | 
						|
        See `ndarray.tolist` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        ndarray.tolist
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.tolist()
 | 
						|
        [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
 | 
						|
 | 
						|
        """
 | 
						|
        return self.__array__().tolist()
 | 
						|
 | 
						|
    # To preserve orientation of result...
 | 
						|
    def sum(self, axis=None, dtype=None, out=None):
 | 
						|
        """
 | 
						|
        Returns the sum of the matrix elements, along the given axis.
 | 
						|
 | 
						|
        Refer to `numpy.sum` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.sum
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.sum`, except that where an `ndarray` would
 | 
						|
        be returned, a `matrix` object is returned instead.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix([[1, 2], [4, 3]])
 | 
						|
        >>> x.sum()
 | 
						|
        10
 | 
						|
        >>> x.sum(axis=1)
 | 
						|
        matrix([[3],
 | 
						|
                [7]])
 | 
						|
        >>> x.sum(axis=1, dtype='float')
 | 
						|
        matrix([[3.],
 | 
						|
                [7.]])
 | 
						|
        >>> out = np.zeros((2, 1), dtype='float')
 | 
						|
        >>> x.sum(axis=1, dtype='float', out=np.asmatrix(out))
 | 
						|
        matrix([[3.],
 | 
						|
                [7.]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    # To update docstring from array to matrix...
 | 
						|
    def squeeze(self, axis=None):
 | 
						|
        """
 | 
						|
        Return a possibly reshaped matrix.
 | 
						|
 | 
						|
        Refer to `numpy.squeeze` for more documentation.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        axis : None or int or tuple of ints, optional
 | 
						|
            Selects a subset of the axes of length one in the shape.
 | 
						|
            If an axis is selected with shape entry greater than one,
 | 
						|
            an error is raised.
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        squeezed : matrix
 | 
						|
            The matrix, but as a (1, N) matrix if it had shape (N, 1).
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.squeeze : related function
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        If `m` has a single column then that column is returned
 | 
						|
        as the single row of a matrix.  Otherwise `m` is returned.
 | 
						|
        The returned matrix is always either `m` itself or a view into `m`.
 | 
						|
        Supplying an axis keyword argument will not affect the returned matrix
 | 
						|
        but it may cause an error to be raised.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> c = np.matrix([[1], [2]])
 | 
						|
        >>> c
 | 
						|
        matrix([[1],
 | 
						|
                [2]])
 | 
						|
        >>> c.squeeze()
 | 
						|
        matrix([[1, 2]])
 | 
						|
        >>> r = c.T
 | 
						|
        >>> r
 | 
						|
        matrix([[1, 2]])
 | 
						|
        >>> r.squeeze()
 | 
						|
        matrix([[1, 2]])
 | 
						|
        >>> m = np.matrix([[1, 2], [3, 4]])
 | 
						|
        >>> m.squeeze()
 | 
						|
        matrix([[1, 2],
 | 
						|
                [3, 4]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.squeeze(self, axis=axis)
 | 
						|
 | 
						|
    # To update docstring from array to matrix...
 | 
						|
    def flatten(self, order='C'):
 | 
						|
        """
 | 
						|
        Return a flattened copy of the matrix.
 | 
						|
 | 
						|
        All `N` elements of the matrix are placed into a single row.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        order : {'C', 'F', 'A', 'K'}, optional
 | 
						|
            'C' means to flatten in row-major (C-style) order. 'F' means to
 | 
						|
            flatten in column-major (Fortran-style) order. 'A' means to
 | 
						|
            flatten in column-major order if `m` is Fortran *contiguous* in
 | 
						|
            memory, row-major order otherwise. 'K' means to flatten `m` in
 | 
						|
            the order the elements occur in memory. The default is 'C'.
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        y : matrix
 | 
						|
            A copy of the matrix, flattened to a `(1, N)` matrix where `N`
 | 
						|
            is the number of elements in the original matrix.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        ravel : Return a flattened array.
 | 
						|
        flat : A 1-D flat iterator over the matrix.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> m = np.matrix([[1,2], [3,4]])
 | 
						|
        >>> m.flatten()
 | 
						|
        matrix([[1, 2, 3, 4]])
 | 
						|
        >>> m.flatten('F')
 | 
						|
        matrix([[1, 3, 2, 4]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.flatten(self, order=order)
 | 
						|
 | 
						|
    def mean(self, axis=None, dtype=None, out=None):
 | 
						|
        """
 | 
						|
        Returns the average of the matrix elements along the given axis.
 | 
						|
 | 
						|
        Refer to `numpy.mean` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.mean
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        Same as `ndarray.mean` except that, where that returns an `ndarray`,
 | 
						|
        this returns a `matrix` object.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3, 4)))
 | 
						|
        >>> x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.mean()
 | 
						|
        5.5
 | 
						|
        >>> x.mean(0)
 | 
						|
        matrix([[4., 5., 6., 7.]])
 | 
						|
        >>> x.mean(1)
 | 
						|
        matrix([[ 1.5],
 | 
						|
                [ 5.5],
 | 
						|
                [ 9.5]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.mean(self, axis, dtype, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def std(self, axis=None, dtype=None, out=None, ddof=0):
 | 
						|
        """
 | 
						|
        Return the standard deviation of the array elements along the given axis.
 | 
						|
 | 
						|
        Refer to `numpy.std` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.std
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.std`, except that where an `ndarray` would
 | 
						|
        be returned, a `matrix` object is returned instead.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3, 4)))
 | 
						|
        >>> x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.std()
 | 
						|
        3.4520525295346629 # may vary
 | 
						|
        >>> x.std(0)
 | 
						|
        matrix([[ 3.26598632,  3.26598632,  3.26598632,  3.26598632]]) # may vary
 | 
						|
        >>> x.std(1)
 | 
						|
        matrix([[ 1.11803399],
 | 
						|
                [ 1.11803399],
 | 
						|
                [ 1.11803399]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.std(self, axis, dtype, out, ddof,
 | 
						|
                             keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def var(self, axis=None, dtype=None, out=None, ddof=0):
 | 
						|
        """
 | 
						|
        Returns the variance of the matrix elements, along the given axis.
 | 
						|
 | 
						|
        Refer to `numpy.var` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.var
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.var`, except that where an `ndarray` would
 | 
						|
        be returned, a `matrix` object is returned instead.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3, 4)))
 | 
						|
        >>> x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.var()
 | 
						|
        11.916666666666666
 | 
						|
        >>> x.var(0)
 | 
						|
        matrix([[ 10.66666667,  10.66666667,  10.66666667,  10.66666667]]) # may vary
 | 
						|
        >>> x.var(1)
 | 
						|
        matrix([[1.25],
 | 
						|
                [1.25],
 | 
						|
                [1.25]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.var(self, axis, dtype, out, ddof,
 | 
						|
                             keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def prod(self, axis=None, dtype=None, out=None):
 | 
						|
        """
 | 
						|
        Return the product of the array elements over the given axis.
 | 
						|
 | 
						|
        Refer to `prod` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        prod, ndarray.prod
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        Same as `ndarray.prod`, except, where that returns an `ndarray`, this
 | 
						|
        returns a `matrix` object instead.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.prod()
 | 
						|
        0
 | 
						|
        >>> x.prod(0)
 | 
						|
        matrix([[  0,  45, 120, 231]])
 | 
						|
        >>> x.prod(1)
 | 
						|
        matrix([[   0],
 | 
						|
                [ 840],
 | 
						|
                [7920]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.prod(self, axis, dtype, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def any(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Test whether any array element along a given axis evaluates to True.
 | 
						|
 | 
						|
        Refer to `numpy.any` for full documentation.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        axis : int, optional
 | 
						|
            Axis along which logical OR is performed
 | 
						|
        out : ndarray, optional
 | 
						|
            Output to existing array instead of creating new one, must have
 | 
						|
            same shape as expected output
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
            any : bool, ndarray
 | 
						|
                Returns a single bool if `axis` is ``None``; otherwise,
 | 
						|
                returns `ndarray`
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.any(self, axis, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def all(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Test whether all matrix elements along a given axis evaluate to True.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        See `numpy.all` for complete descriptions
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.all
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.all`, but it returns a `matrix` object.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> y = x[0]; y
 | 
						|
        matrix([[0, 1, 2, 3]])
 | 
						|
        >>> (x == y)
 | 
						|
        matrix([[ True,  True,  True,  True],
 | 
						|
                [False, False, False, False],
 | 
						|
                [False, False, False, False]])
 | 
						|
        >>> (x == y).all()
 | 
						|
        False
 | 
						|
        >>> (x == y).all(0)
 | 
						|
        matrix([[False, False, False, False]])
 | 
						|
        >>> (x == y).all(1)
 | 
						|
        matrix([[ True],
 | 
						|
                [False],
 | 
						|
                [False]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.all(self, axis, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def max(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Return the maximum value along an axis.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        See `amax` for complete descriptions
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        amax, ndarray.max
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.max`, but returns a `matrix` object
 | 
						|
        where `ndarray.max` would return an ndarray.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.max()
 | 
						|
        11
 | 
						|
        >>> x.max(0)
 | 
						|
        matrix([[ 8,  9, 10, 11]])
 | 
						|
        >>> x.max(1)
 | 
						|
        matrix([[ 3],
 | 
						|
                [ 7],
 | 
						|
                [11]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.max(self, axis, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def argmax(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Indexes of the maximum values along an axis.
 | 
						|
 | 
						|
        Return the indexes of the first occurrences of the maximum values
 | 
						|
        along the specified axis.  If axis is None, the index is for the
 | 
						|
        flattened matrix.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        See `numpy.argmax` for complete descriptions
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.argmax
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.argmax`, but returns a `matrix` object
 | 
						|
        where `ndarray.argmax` would return an `ndarray`.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.argmax()
 | 
						|
        11
 | 
						|
        >>> x.argmax(0)
 | 
						|
        matrix([[2, 2, 2, 2]])
 | 
						|
        >>> x.argmax(1)
 | 
						|
        matrix([[3],
 | 
						|
                [3],
 | 
						|
                [3]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.argmax(self, axis, out)._align(axis)
 | 
						|
 | 
						|
    def min(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Return the minimum value along an axis.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        See `amin` for complete descriptions.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        amin, ndarray.min
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.min`, but returns a `matrix` object
 | 
						|
        where `ndarray.min` would return an ndarray.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = -np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[  0,  -1,  -2,  -3],
 | 
						|
                [ -4,  -5,  -6,  -7],
 | 
						|
                [ -8,  -9, -10, -11]])
 | 
						|
        >>> x.min()
 | 
						|
        -11
 | 
						|
        >>> x.min(0)
 | 
						|
        matrix([[ -8,  -9, -10, -11]])
 | 
						|
        >>> x.min(1)
 | 
						|
        matrix([[ -3],
 | 
						|
                [ -7],
 | 
						|
                [-11]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.min(self, axis, out, keepdims=True)._collapse(axis)
 | 
						|
 | 
						|
    def argmin(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Indexes of the minimum values along an axis.
 | 
						|
 | 
						|
        Return the indexes of the first occurrences of the minimum values
 | 
						|
        along the specified axis.  If axis is None, the index is for the
 | 
						|
        flattened matrix.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        See `numpy.argmin` for complete descriptions.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.argmin
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        This is the same as `ndarray.argmin`, but returns a `matrix` object
 | 
						|
        where `ndarray.argmin` would return an `ndarray`.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = -np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[  0,  -1,  -2,  -3],
 | 
						|
                [ -4,  -5,  -6,  -7],
 | 
						|
                [ -8,  -9, -10, -11]])
 | 
						|
        >>> x.argmin()
 | 
						|
        11
 | 
						|
        >>> x.argmin(0)
 | 
						|
        matrix([[2, 2, 2, 2]])
 | 
						|
        >>> x.argmin(1)
 | 
						|
        matrix([[3],
 | 
						|
                [3],
 | 
						|
                [3]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.argmin(self, axis, out)._align(axis)
 | 
						|
 | 
						|
    def ptp(self, axis=None, out=None):
 | 
						|
        """
 | 
						|
        Peak-to-peak (maximum - minimum) value along the given axis.
 | 
						|
 | 
						|
        Refer to `numpy.ptp` for full documentation.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        numpy.ptp
 | 
						|
 | 
						|
        Notes
 | 
						|
        -----
 | 
						|
        Same as `ndarray.ptp`, except, where that would return an `ndarray` object,
 | 
						|
        this returns a `matrix` object.
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.ptp()
 | 
						|
        11
 | 
						|
        >>> x.ptp(0)
 | 
						|
        matrix([[8, 8, 8, 8]])
 | 
						|
        >>> x.ptp(1)
 | 
						|
        matrix([[3],
 | 
						|
                [3],
 | 
						|
                [3]])
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ptp(self, axis, out)._align(axis)
 | 
						|
 | 
						|
    @property
 | 
						|
    def I(self):  # noqa: E743
 | 
						|
        """
 | 
						|
        Returns the (multiplicative) inverse of invertible `self`.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        None
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : matrix object
 | 
						|
            If `self` is non-singular, `ret` is such that ``ret * self`` ==
 | 
						|
            ``self * ret`` == ``np.matrix(np.eye(self[0,:].size))`` all return
 | 
						|
            ``True``.
 | 
						|
 | 
						|
        Raises
 | 
						|
        ------
 | 
						|
        numpy.linalg.LinAlgError: Singular matrix
 | 
						|
            If `self` is singular.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        linalg.inv
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> m = np.matrix('[1, 2; 3, 4]'); m
 | 
						|
        matrix([[1, 2],
 | 
						|
                [3, 4]])
 | 
						|
        >>> m.getI()
 | 
						|
        matrix([[-2. ,  1. ],
 | 
						|
                [ 1.5, -0.5]])
 | 
						|
        >>> m.getI() * m
 | 
						|
        matrix([[ 1.,  0.], # may vary
 | 
						|
                [ 0.,  1.]])
 | 
						|
 | 
						|
        """
 | 
						|
        M, N = self.shape
 | 
						|
        if M == N:
 | 
						|
            from numpy.linalg import inv as func
 | 
						|
        else:
 | 
						|
            from numpy.linalg import pinv as func
 | 
						|
        return asmatrix(func(self))
 | 
						|
 | 
						|
    @property
 | 
						|
    def A(self):
 | 
						|
        """
 | 
						|
        Return `self` as an `ndarray` object.
 | 
						|
 | 
						|
        Equivalent to ``np.asarray(self)``.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        None
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : ndarray
 | 
						|
            `self` as an `ndarray`
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.getA()
 | 
						|
        array([[ 0,  1,  2,  3],
 | 
						|
               [ 4,  5,  6,  7],
 | 
						|
               [ 8,  9, 10, 11]])
 | 
						|
 | 
						|
        """
 | 
						|
        return self.__array__()
 | 
						|
 | 
						|
    @property
 | 
						|
    def A1(self):
 | 
						|
        """
 | 
						|
        Return `self` as a flattened `ndarray`.
 | 
						|
 | 
						|
        Equivalent to ``np.asarray(x).ravel()``
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        None
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : ndarray
 | 
						|
            `self`, 1-D, as an `ndarray`
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4))); x
 | 
						|
        matrix([[ 0,  1,  2,  3],
 | 
						|
                [ 4,  5,  6,  7],
 | 
						|
                [ 8,  9, 10, 11]])
 | 
						|
        >>> x.getA1()
 | 
						|
        array([ 0,  1,  2, ...,  9, 10, 11])
 | 
						|
 | 
						|
 | 
						|
        """
 | 
						|
        return self.__array__().ravel()
 | 
						|
 | 
						|
    def ravel(self, order='C'):
 | 
						|
        """
 | 
						|
        Return a flattened matrix.
 | 
						|
 | 
						|
        Refer to `numpy.ravel` for more documentation.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        order : {'C', 'F', 'A', 'K'}, optional
 | 
						|
            The elements of `m` are read using this index order. 'C' means to
 | 
						|
            index the elements in C-like order, with the last axis index
 | 
						|
            changing fastest, back to the first axis index changing slowest.
 | 
						|
            'F' means to index the elements in Fortran-like index order, with
 | 
						|
            the first index changing fastest, and the last index changing
 | 
						|
            slowest. Note that the 'C' and 'F' options take no account of the
 | 
						|
            memory layout of the underlying array, and only refer to the order
 | 
						|
            of axis indexing.  'A' means to read the elements in Fortran-like
 | 
						|
            index order if `m` is Fortran *contiguous* in memory, C-like order
 | 
						|
            otherwise.  'K' means to read the elements in the order they occur
 | 
						|
            in memory, except for reversing the data when strides are negative.
 | 
						|
            By default, 'C' index order is used.
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : matrix
 | 
						|
            Return the matrix flattened to shape `(1, N)` where `N`
 | 
						|
            is the number of elements in the original matrix.
 | 
						|
            A copy is made only if necessary.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        matrix.flatten : returns a similar output matrix but always a copy
 | 
						|
        matrix.flat : a flat iterator on the array.
 | 
						|
        numpy.ravel : related function which returns an ndarray
 | 
						|
 | 
						|
        """
 | 
						|
        return N.ndarray.ravel(self, order=order)
 | 
						|
 | 
						|
    @property
 | 
						|
    def T(self):
 | 
						|
        """
 | 
						|
        Returns the transpose of the matrix.
 | 
						|
 | 
						|
        Does *not* conjugate!  For the complex conjugate transpose, use ``.H``.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        None
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : matrix object
 | 
						|
            The (non-conjugated) transpose of the matrix.
 | 
						|
 | 
						|
        See Also
 | 
						|
        --------
 | 
						|
        transpose, getH
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> m = np.matrix('[1, 2; 3, 4]')
 | 
						|
        >>> m
 | 
						|
        matrix([[1, 2],
 | 
						|
                [3, 4]])
 | 
						|
        >>> m.getT()
 | 
						|
        matrix([[1, 3],
 | 
						|
                [2, 4]])
 | 
						|
 | 
						|
        """
 | 
						|
        return self.transpose()
 | 
						|
 | 
						|
    @property
 | 
						|
    def H(self):
 | 
						|
        """
 | 
						|
        Returns the (complex) conjugate transpose of `self`.
 | 
						|
 | 
						|
        Equivalent to ``np.transpose(self)`` if `self` is real-valued.
 | 
						|
 | 
						|
        Parameters
 | 
						|
        ----------
 | 
						|
        None
 | 
						|
 | 
						|
        Returns
 | 
						|
        -------
 | 
						|
        ret : matrix object
 | 
						|
            complex conjugate transpose of `self`
 | 
						|
 | 
						|
        Examples
 | 
						|
        --------
 | 
						|
        >>> x = np.matrix(np.arange(12).reshape((3,4)))
 | 
						|
        >>> z = x - 1j*x; z
 | 
						|
        matrix([[  0. +0.j,   1. -1.j,   2. -2.j,   3. -3.j],
 | 
						|
                [  4. -4.j,   5. -5.j,   6. -6.j,   7. -7.j],
 | 
						|
                [  8. -8.j,   9. -9.j,  10.-10.j,  11.-11.j]])
 | 
						|
        >>> z.getH()
 | 
						|
        matrix([[ 0. -0.j,  4. +4.j,  8. +8.j],
 | 
						|
                [ 1. +1.j,  5. +5.j,  9. +9.j],
 | 
						|
                [ 2. +2.j,  6. +6.j, 10.+10.j],
 | 
						|
                [ 3. +3.j,  7. +7.j, 11.+11.j]])
 | 
						|
 | 
						|
        """
 | 
						|
        if issubclass(self.dtype.type, N.complexfloating):
 | 
						|
            return self.transpose().conjugate()
 | 
						|
        else:
 | 
						|
            return self.transpose()
 | 
						|
 | 
						|
    # kept for compatibility
 | 
						|
    getT = T.fget
 | 
						|
    getA = A.fget
 | 
						|
    getA1 = A1.fget
 | 
						|
    getH = H.fget
 | 
						|
    getI = I.fget
 | 
						|
 | 
						|
def _from_string(str, gdict, ldict):
 | 
						|
    rows = str.split(';')
 | 
						|
    rowtup = []
 | 
						|
    for row in rows:
 | 
						|
        trow = row.split(',')
 | 
						|
        newrow = []
 | 
						|
        for x in trow:
 | 
						|
            newrow.extend(x.split())
 | 
						|
        trow = newrow
 | 
						|
        coltup = []
 | 
						|
        for col in trow:
 | 
						|
            col = col.strip()
 | 
						|
            try:
 | 
						|
                thismat = ldict[col]
 | 
						|
            except KeyError:
 | 
						|
                try:
 | 
						|
                    thismat = gdict[col]
 | 
						|
                except KeyError as e:
 | 
						|
                    raise NameError(f"name {col!r} is not defined") from None
 | 
						|
 | 
						|
            coltup.append(thismat)
 | 
						|
        rowtup.append(concatenate(coltup, axis=-1))
 | 
						|
    return concatenate(rowtup, axis=0)
 | 
						|
 | 
						|
 | 
						|
@set_module('numpy')
 | 
						|
def bmat(obj, ldict=None, gdict=None):
 | 
						|
    """
 | 
						|
    Build a matrix object from a string, nested sequence, or array.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    obj : str or array_like
 | 
						|
        Input data. If a string, variables in the current scope may be
 | 
						|
        referenced by name.
 | 
						|
    ldict : dict, optional
 | 
						|
        A dictionary that replaces local operands in current frame.
 | 
						|
        Ignored if `obj` is not a string or `gdict` is None.
 | 
						|
    gdict : dict, optional
 | 
						|
        A dictionary that replaces global operands in current frame.
 | 
						|
        Ignored if `obj` is not a string.
 | 
						|
 | 
						|
    Returns
 | 
						|
    -------
 | 
						|
    out : matrix
 | 
						|
        Returns a matrix object, which is a specialized 2-D array.
 | 
						|
 | 
						|
    See Also
 | 
						|
    --------
 | 
						|
    block :
 | 
						|
        A generalization of this function for N-d arrays, that returns normal
 | 
						|
        ndarrays.
 | 
						|
 | 
						|
    Examples
 | 
						|
    --------
 | 
						|
    >>> import numpy as np
 | 
						|
    >>> A = np.asmatrix('1 1; 1 1')
 | 
						|
    >>> B = np.asmatrix('2 2; 2 2')
 | 
						|
    >>> C = np.asmatrix('3 4; 5 6')
 | 
						|
    >>> D = np.asmatrix('7 8; 9 0')
 | 
						|
 | 
						|
    All the following expressions construct the same block matrix:
 | 
						|
 | 
						|
    >>> np.bmat([[A, B], [C, D]])
 | 
						|
    matrix([[1, 1, 2, 2],
 | 
						|
            [1, 1, 2, 2],
 | 
						|
            [3, 4, 7, 8],
 | 
						|
            [5, 6, 9, 0]])
 | 
						|
    >>> np.bmat(np.r_[np.c_[A, B], np.c_[C, D]])
 | 
						|
    matrix([[1, 1, 2, 2],
 | 
						|
            [1, 1, 2, 2],
 | 
						|
            [3, 4, 7, 8],
 | 
						|
            [5, 6, 9, 0]])
 | 
						|
    >>> np.bmat('A,B; C,D')
 | 
						|
    matrix([[1, 1, 2, 2],
 | 
						|
            [1, 1, 2, 2],
 | 
						|
            [3, 4, 7, 8],
 | 
						|
            [5, 6, 9, 0]])
 | 
						|
 | 
						|
    """
 | 
						|
    if isinstance(obj, str):
 | 
						|
        if gdict is None:
 | 
						|
            # get previous frame
 | 
						|
            frame = sys._getframe().f_back
 | 
						|
            glob_dict = frame.f_globals
 | 
						|
            loc_dict = frame.f_locals
 | 
						|
        else:
 | 
						|
            glob_dict = gdict
 | 
						|
            loc_dict = ldict
 | 
						|
 | 
						|
        return matrix(_from_string(obj, glob_dict, loc_dict))
 | 
						|
 | 
						|
    if isinstance(obj, (tuple, list)):
 | 
						|
        # [[A,B],[C,D]]
 | 
						|
        arr_rows = []
 | 
						|
        for row in obj:
 | 
						|
            if isinstance(row, N.ndarray):  # not 2-d
 | 
						|
                return matrix(concatenate(obj, axis=-1))
 | 
						|
            else:
 | 
						|
                arr_rows.append(concatenate(row, axis=-1))
 | 
						|
        return matrix(concatenate(arr_rows, axis=0))
 | 
						|
    if isinstance(obj, N.ndarray):
 | 
						|
        return matrix(obj)
 |