This is simply recorded here so that I don't forget my matrix algebra stuff.
Since SciPy isn't rolled out for 10.2.x and using numpy's matrix operations adds another layer of things that you have to worry about, I thought I would play with numpy's linear algebra module as suggested in this scipy.linalg thread
The demo here shows to translate and rotate a series of coordinates (represented as an array) about the mean center of the array. The reverse is performed to transform back to the original.
>>> # working with the linear algebra module to do matrix stuff >>> import numpy as np >>> # import the linear algebra module >>> >>> from numpy.linalg import linalg as nla # refer to it as nla >>> >>> # unit square at 1,1 origin with mid-point 1.5,1.5 >>> >>> xs = [1,1,1.5,2,2] >>> ys = [1,2,1.5,2,1] >>> XYs = [[xs,ys] for i in range(len(xs))] >>> XYmean = np.mean(XYs, axis=0) # get the mean >>> XYmean array([ 1.5, 1.5]) >>> A = np.array(XYs) >>> A # the array form of XYs list array([[ 1. , 1. ], [ 1. , 2. ], [ 1.5, 1.5], [ 2. , 2. ], [ 2. , 1. ]]) >>> # Translate/shift the array by adding the -ve mean >>> A_t = nla.add(A,-XYmean) # to subtract, just add -ve values >>> A_t # the array shifted about the mean array([[-0.5, -0.5], [-0.5, 0.5], [ 0. , 0. ], [ 0.5, 0.5], [ 0.5, -0.5]]) >>> # form the clockwise and counter-clockwise matrices, eg. 45 deg rotation >>> a = np.radians(45.0) >>> r_cw = np.array([[np.cos(a),np.sin(a)],[-np.sin(a),np.cos(a)]]) #rotate clockwise >>> r_cc = np.array([[np.cos(a),-np.sin(a)],[np.sin(a),np.cos(a)]]) #rotate counter-clockwise >>> r_cw array([[ 0.70710678, 0.70710678], [-0.70710678, 0.70710678]]) >>> r_cc array([[ 0.70710678, -0.70710678], [ 0.70710678, 0.70710678]]) >>> A_tr = A_t.dot(r_cw.T) # rotate the translated matrix by 45 degrees >>> A_tr array([[ -7.07106781e-01, -5.55111512e-17], [ -5.55111512e-17, 7.07106781e-01], [ 0.00000000e+00, 0.00000000e+00], [ 7.07106781e-01, 5.55111512e-17], [ 5.55111512e-17, -7.07106781e-01]]) >>> >>> A_rb = A_tr.dot(r_cc.T) # rotate back >>> A_rb array([[-0.5, -0.5], [-0.5, 0.5], [ 0. , 0. ], [ 0.5, 0.5], [ 0.5, -0.5]]) >>> A_final = nla.add(A_rb,XYmean) # translate back to its original form >>> A_final array([[ 1. , 1. ], [ 1. , 2. ], [ 1.5, 1.5], [ 2. , 2. ], [ 2. , 1. ]]) >>> >>> # Done!!!! array translated and rotated, then returned to its original form.
Hope this helps someone else not reinvent the wheel. Email comments
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.