code: def changebasis(uu, vv, nn, pps):
      
      MM = np.zeros([3, 3], np.float)
      for ii in range(3):
          MM[ii, 0] = uu[ii]
          MM[ii, 1] = vv[ii]
          MM[ii, 2] = nn[ii]
      PP = np.linalg.inv(MM)
      newpps = list()
      for pp in pps:
          newpps.append(matrixTimesVector(PP, pp))
      return newpps
docs: For a list of points given in standard coordinates (in terms of e1, e2 and e3), returns the same list
      expressed in the basis (uu, vv, nn), which is supposed to be orthonormal.
      :param uu: First vector of the basis
      :param vv: Second vector of the basis
      :param nn: Third vector of the bais
      :param pps: List of points in basis (e1, e2, e3)
      :return: List of points in basis (uu, vv, nn)