Source code for geometry.formatting

from string import ljust

from contracts import contract, describe_type, describe_value
import numpy as np


[docs]def printm(*args): print(formatm(*args))
[docs]def formatm(*args, **kwargs): #name_len = 10 assert len(args) > 0 assert len(args) % 2 == 0 cols = [] for i in range(len(args) / 2): name = args[i * 2] matrix = args[i * 2 + 1] if not isinstance(name, str): raise ValueError('I expect a string for label, not %s.' % describe_type(name)) # varname = ' %s:' % rjust(name, name_len) varname = ' %s:' % name if isinstance(matrix, np.ndarray): # raise ValueError('I expect a numpy array for value, not %s.' % # describe_type(matrix)) value = format_matrix(matrix, **kwargs) if matrix.ndim > 1: varname = '\n' + varname else: value = describe_value(matrix) cols.append(varname) cols.append(value) cols = add_spacer(cols) return join_columns(cols)
[docs]def add_spacer(cols, spacer=' '): r = [] for c in cols: r.append(c) r.append(spacer) return r[:-1]
[docs]@contract(cols='list(str)') def join_columns(cols): # split lines cols = [x.split('\n') for x in cols] # count max number of rows nrows = max([len(col) for col in cols]) # get row of one column or empty string get_cell = lambda col, i: col[i] if len(col) > i else '' # get maximum length of column col_width = lambda col: max([len(cell) for cell in col]) col_widths = [col_width(col) for i, col in enumerate(cols)] s = '' for j in range(nrows): srow = '' for i, col in enumerate(cols): cell = get_cell(col, j) cell = ljust(cell, col_widths[i]) srow += cell s += srow + '\n' return s
[docs]def format_matrix(matrix, fsize=8, format_str='%g'): #@UnusedVariable if matrix.ndim == 2: nrows, ncols = matrix.shape cols = [[] for _ in range(ncols)] for j in range(ncols): for i in range(nrows): s = (' ' + format_str) % matrix[i, j] cols[j].append(s) cols = ["\n".join(col) for col in cols] borders = "\n".join(["|" for i in range(nrows)]) bcols = [] bcols.append(borders) bcols.extend(cols) bcols.append(borders) return join_columns(bcols) return "%s" % matrix
if __name__ == '__main__': A = np.eye(3) B = np.random.randn(3, 4) printm('A (identity):', A, 'B (random):', B)