def fix(x): """ Rounds towards zero. x_rounded = fix(x) rounds the elements of x to the nearest integers towards zero. For negative numbers is equivalent to ceil and for positive to floor. """ dim = numerix.shape(x) if numerix.mlab.rank(x)==2: y = reshape(x,(1,dim[0]*dim[1]))[0] y = y.tolist() elif numerix.mlab.rank(x)==1: y = x else: y = [x] for i in range(len(y)): if y[i]>0: y[i] = floor(y[i]) else: y[i] = ceil(y[i]) if numerix.mlab.rank(x)==2: x = reshape(y,dim) elif numerix.mlab.rank(x)==0: x = y[0] return x
def polyval(p,x): """ y = polyval(p,x) p is a vector of polynomial coeffients and y is the polynomial evaluated at x. Example code to remove a polynomial (quadratic) trend from y: p = polyfit(x, y, 2) trend = polyval(p, x) resid = y - trend See also polyfit """ x = asarray(x)+0. p = reshape(p, (len(p),1)) X = vander(x,len(p)) y = matrixmultiply(X,p) return reshape(y, x.shape)
def polyval(p, x): """ y = polyval(p,x) p is a vector of polynomial coeffients and y is the polynomial evaluated at x. Example code to remove a polynomial (quadratic) trend from y: p = polyfit(x, y, 2) trend = polyval(p, x) resid = y - trend See also polyfit """ x = asarray(x) + 0. p = reshape(p, (len(p), 1)) X = vander(x, len(p)) y = matrixmultiply(X, p) return reshape(y, x.shape)
def locate_label(self, linecontour, labelwidth): """find a good place to plot a label (relatively flat part of the contour) and the angle of rotation for the text object """ nsize= len(linecontour) if labelwidth > 1: xsize = int(ceil(nsize/labelwidth)) else: xsize = 1 if xsize == 1: ysize = nsize else: ysize = labelwidth XX = resize(array(linecontour)[:,0],(xsize, ysize)) YY = resize(array(linecontour)[:,1],(xsize,ysize)) yfirst = YY[:,0] ylast = YY[:,-1] xfirst = XX[:,0] xlast = XX[:,-1] s = (reshape(yfirst, (xsize,1))-YY)*(reshape(xlast,(xsize,1))-reshape(xfirst,(xsize,1)))-(reshape(xfirst,(xsize,1))-XX)*(reshape(ylast,(xsize,1))-reshape(yfirst,(xsize,1))) L=sqrt((xlast-xfirst)**2+(ylast-yfirst)**2) dist = add.reduce(([(abs(s)[i]/L[i]) for i in range(xsize)]),-1) x,y,ind = self.get_label_coords(dist, XX, YY, ysize, labelwidth) angle = arctan2(ylast - yfirst, xlast - xfirst) rotation = angle[ind]*180/pi if rotation > 90: rotation = rotation -180 if rotation < -90: rotation = 180 + rotation dind = list(linecontour).index((x,y)) return x,y, rotation, dind
def polyfit(x,y,N): """ Do a best fit polynomial of order N of y to x. Return value is a vector of polynomial coefficients [pk ... p1 p0]. Eg, for N=2 p2*x0^2 + p1*x0 + p0 = y1 p2*x1^2 + p1*x1 + p0 = y1 p2*x2^2 + p1*x2 + p0 = y2 ..... p2*xk^2 + p1*xk + p0 = yk Method: if X is a the Vandermonde Matrix computed from x (see http://mathworld.wolfram.com/VandermondeMatrix.html), then the polynomial least squares solution is given by the 'p' in X*p = y where X is a len(x) x N+1 matrix, p is a N+1 length vector, and y is a len(x) x 1 vector This equation can be solved as p = (XT*X)^-1 * XT * y where XT is the transpose of X and -1 denotes the inverse. For more info, see http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html, but note that the k's and n's in the superscripts and subscripts on that page. The linear algebra is correct, however. See also polyval """ x = asarray(x)+0. y = asarray(y)+0. y = reshape(y, (len(y),1)) X = Matrix(vander(x, N+1)) Xt = Matrix(transpose(X)) c = array(linear_algebra.inverse(Xt*X)*Xt*y) # convert back to array c.shape = (N+1,) return c
def polyfit(x, y, N): """ Do a best fit polynomial of order N of y to x. Return value is a vector of polynomial coefficients [pk ... p1 p0]. Eg, for N=2 p2*x0^2 + p1*x0 + p0 = y1 p2*x1^2 + p1*x1 + p0 = y1 p2*x2^2 + p1*x2 + p0 = y2 ..... p2*xk^2 + p1*xk + p0 = yk Method: if X is a the Vandermonde Matrix computed from x (see http://mathworld.wolfram.com/VandermondeMatrix.html), then the polynomial least squares solution is given by the 'p' in X*p = y where X is a len(x) x N+1 matrix, p is a N+1 length vector, and y is a len(x) x 1 vector This equation can be solved as p = (XT*X)^-1 * XT * y where XT is the transpose of X and -1 denotes the inverse. For more info, see http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html, but note that the k's and n's in the superscripts and subscripts on that page. The linear algebra is correct, however. See also polyval """ x = asarray(x) + 0. y = asarray(y) + 0. y = reshape(y, (len(y), 1)) X = Matrix(vander(x, N + 1)) Xt = Matrix(transpose(X)) c = array(linear_algebra.inverse(Xt * X) * Xt * y) # convert back to array c.shape = (N + 1, ) return c