class Basis: """ Represents the basis of a vector-space or lattice. """ def __init__(self, arg, *, row_vectors=False): try: if isinstance(arg, Basis): self.matrix = arg.matrix.copy() elif isinstance(arg, list) and isinstance(arg[0], Matrix): self.matrix = Matrix.hstack(*arg) elif isinstance(arg, tuple) and isinstance(arg[0], Matrix): self.matrix = Matrix.hstack(*arg) else: self.matrix = Matrix(arg) if row_vectors: self.matrix = self.matrix.T except TypeError: raise TypeError('Cannot construct a Basis from an object of type {}'.format(type(arg))) def __str__(self): return self.matrix.__str__() def __repr__(self): return 'Basis({})'.format(self.matrix.__str__()) def __len__(self): return self.matrix.cols def __getitem__(self, i): return self.matrix.__getitem__((slice(None), i)) def __setitem__(self, i, val): return self.matrix.__setitem__((slice(None), i), val) def __iter__(self): for i in range(self.__len__()): yield self.__getitem__(i) def copy(self): return Basis(self.matrix.copy()) def vol(self): return abs(self.matrix.det()) def mat(self): return self.matrix def inv(self): return self.matrix.inv() def map(self, f): return Basis(self.matrix.applyfunc(f))