def norm(x, order=None): '''Matrix or vector norm x -- input array ord -- None = Frobenius | 2-norm 'fro' = Frobenius | n/a inf = max(sum(abs(x),axis=1)) | max(abs(x)) -inf = min(sum(abs(x),axis=1)) | min(abs(x)) 0 = n/a | sum(x != 0) 1 = max(sum(abs(x),axis=0)) | as below -1 = min(sum(abs(x),axis=0)) | as below 2 = 2-norm (largest s.v.) | as below -2 = smallest singular value | as below other = n/a | sum(abs(x)**ord)**(1./ord) Return norm ''' if order is None: return _linalg.norm(x) if order == 'fro': order = _normorder.FROBENIUS # @UndefinedVariable elif _isinf(order): if order > 0: order = _normorder.POS_INFINITY # @UndefinedVariable else: order = _normorder.NEG_INFINITY # @UndefinedVariable try: return _linalg.norm(x, order) except Exception, e: raise LinAlgError(e)
def tensordot(a, b, axes=2): '''Tensor dot product of two arrays ''' if isinstance(axes, int): bx = range(axes) ao = a.getRank() - axes ax = [ ao + i for i in bx ] else: t = type(axes) if t is _types.ListType or t is _types.TupleType: if len(axes) == 0: raise ValueError, "Given axes sequence should be non-empty" if len(axes) == 1: ax = axes[0] bx = axes[0] else: ax = axes[0] bx = axes[1] ta = type(ax) tal = ta is _types.ListType or ta is _types.TupleType tb = type(bx) tbl = tb is _types.ListType or tb is _types.TupleType if tal != tbl: if tal: bx = list(bx) else: ax = list(ax) else: raise ValueError, "Given axes has wrong type" return _linalg.tensorDotProduct(a, b, ax, bx)
def tensordot(a, b, axes=2): '''Tensor dot product of two arrays ''' if isinstance(axes, int): bx = list(range(axes)) ao = a.getRank() - axes ax = [ao + i for i in bx] else: if isinstance(axes, (list, tuple)): if len(axes) == 0: raise ValueError("Given axes sequence should be non-empty") if len(axes) == 1: ax = axes[0] bx = axes[0] else: ax = axes[0] bx = axes[1] tal = isinstance(ax, (list, tuple)) tbl = isinstance(bx, (list, tuple)) if tal != tbl: if tal: bx = list(bx) else: ax = list(ax) else: raise ValueError("Given axes has wrong type") return _linalg.tensorDotProduct(a, b, ax, bx)
def eigvals(a): '''Eigenvalues ''' try: return _linalg.calcEigenvalues(a) except Exception, e: raise LinAlgError(e)
def qr(a, mode='full'): '''QR decomposition ''' try: return _linalg.calcQRDecomposition(a) except Exception, e: raise LinAlgError(e)
def cholesky(a): '''Cholesky decomposition ''' try: return _linalg.calcCholeskyDecomposition(a) except Exception, e: raise LinAlgError(e)
def svd(a, full_matrices=1, compute_uv=1): '''Singular value decomposition ''' try: return _linalg.calcSingularValueDecomposition(a) except Exception, e: raise LinAlgError(e)
def pinv(a, rcond=1e-15): '''Pseudo-inverse of array ''' try: return _linalg.calcPseudoInverse(a) except Exception, e: raise LinAlgError(e)
def solve(a, b): '''Solve equation a x = b ''' try: return _linalg.solve(a, b) except Exception, e: raise LinAlgError(e)
def eig(a): '''Eigen decomposition ''' try: return _linalg.calcEigenDecomposition(a) except Exception, e: raise LinAlgError(e)
def matrix_power(a, n): '''Raise matrix to given power ''' try: return _linalg.power(a, n) except Exception, e: raise LinAlgError(e)
def inv(a): '''Inverse of square array ''' try: return _linalg.calcInverse(a) except Exception, e: raise LinAlgError(e)
def det(a): '''Determinant ''' try: return _linalg.calcDeterminant(a) except Exception, e: raise LinAlgError(e)
def trace(a, offset=0, axis1=0, axis2=1, dtype=None): t = _linalg.trace(a, offset) dtype = _translatenativetype(dtype) if dtype is not None: t = t.cast(dtype.value) return t
def trace(a, offset=0, axis1=0, axis2=1, dtype=None): dtype = _translatenativetype(dtype) if dtype is None: dtval = a.getDType() else: dtval = dtype.value return _linalg.trace(a, offset).cast(dtval)
def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None): '''Cross product of two (arrays of vectors) a -- first vector b -- second vector axisa -- axis of a that defines the vector(s) axisb -- axis of b that defines the vector(s) axisc -- axis of c that will contain the cross product(s) axis -- override all values of axis values ''' if axis is not None: axisa = axisb = axisc = axis return _linalg.crossProduct(a, b, axisa, axisb, axisc)
def matmul(a, b): '''Matrix product of two datasets ''' a = _asarray(a) b = _asarray(b) prepend = a.rank == 1 if prepend: a.shape = 1, a.shape[0] append = b.rank == 1 if append: b.shape = b.shape[0], 1 m = _asarray(_linalg.matrixProduct(a._jdataset(), b._jdataset())) if prepend: m.shape = m.shape[1:] if append: m.shape = m.shape[:-1] return m
def matmul(a, b): '''Matrix product of two datasets ''' a = _asarray(a) b = _asarray(b) prepend = a.rank == 1 if prepend: a.shape = 1,a.shape[0] append = b.rank == 1 if append: b.shape = b.shape[0],1 m = _asarray(_linalg.matrixProduct(a._jdataset(), b._jdataset())) if prepend: m.shape = m.shape[1:] if append: m.shape = m.shape[:-1] return m
def cond(a, order=None): '''Condition number x -- input array ord -- None = 2-norm computed directly using SVD 'fro' = Frobenius norm inf = max(sum(abs(x),axis=1)) -inf = min(sum(abs(x),axis=1)) 0 = n/a | sum(x != 0) 1 = max(sum(abs(x),axis=0)) -1 = min(sum(abs(x),axis=0)) 2 = 2-norm (largest s.v.) -2 = smallest singular value other = n/a Return norm ''' if order is None: try: return _linalg.calcConditionNumber(_jinput(a)) except Exception, e: raise LinAlgError(e)
def dot(a, b): '''Dot product of two arrays''' return _linalg.dotProduct(a, b)
def vdot(a, b): '''Dot product of two vectors with first vector conjugated if complex''' return _linalg.dotProduct(conjugate(a.flatten()), b.flatten())
def inner(a, b): '''Inner product of two arrays (sum product over last dimensions)''' return _linalg.tensorDotProduct(a, b, -1, -1)
def outer(a, b): '''Outer product of two arrays''' return _linalg.outerProduct(a, b)
def kron(a, b): '''Kronecker product of two arrays''' return _linalg.kroneckerProduct(a, b)