How to create a clean x and y axis for a numpy matrix?

I am creating a distance matrix in numpy, with the output as such:

['H', 'B', 'D', 'A', 'I', 'C', 'F'] [[ 0. 2.4 6.1 3.2 5.2 3.9 7.1] [ 2.4 0. 4.1 1.2 3.2 1.9 5.1] [ 6.1 4.1 0. 3.1 6.9 2.8 5.2] [ 3.2 1.2 3.1 0. 4. 0.9 4.1] [ 5.2 3.2 6.9 4. 0. 4.7 7.9] [ 3.9 1.9 2.8 0.9 4.7 0. 3.8] [ 7.1 5.1 5.2 4.1 7.9 3.8 0. ]] 

I print this x axis by simply printing the list before printing the actual matrix, a:

 print" ", names print a 

I need an axis in this order, since the names of the names correctly order the variables with their value in the matrix. But how could I get the same y axis in numpy?

+4
source share
1 answer

It's not so pretty, but this pretty table prints works:

 import numpy as np names=np.array(['H', 'B', 'D', 'A', 'I', 'C', 'F']) a=np.array([[ 0., 2.4, 6.1, 3.2, 5.2, 3.9, 7.1], [2.4, 0., 4.1, 1.2, 3.2, 1.9, 5.1], [6.1, 4.1, 0., 3.1, 6.9, 2.8, 5.2], [3.2, 1.2, 3.1, 0., 4., 0.9, 4.1], [5.2, 3.2, 6.9, 4., 0., 4.7, 7.9], [3.9, 1.9 , 2.8, 0.9, 4.7, 0., 3.8], [7.1, 5.1, 5.2, 4.1, 7.9, 3.8, 0. ]]) def pptable(x_axis,y_axis,table): def format_field(field, fmt='{:,.2f}'): if type(field) is str: return field if type(field) is tuple: return field[1].format(field[0]) return fmt.format(field) def get_max_col_w(table, index): return max([len(format_field(row[index])) for row in table]) for i,l in enumerate(table): l.insert(0,y_axis[i]) x_axis.insert(0,' ') table.insert(0,x_axis) col_paddings=[get_max_col_w(table, i) for i in range(len(table[0]))] for i,row in enumerate(table): # left col row_tab=[str(row[0]).ljust(col_paddings[0])] # rest of the cols row_tab+=[format_field(row[j]).rjust(col_paddings[j]) for j in range(1,len(row))] print(' '.join(row_tab)) x_axis=['x{}'.format(c) for c in names] y_axis=['y{}'.format(c) for c in names] pptable(x_axis,y_axis,a.tolist()) 

Print

  xH xB xD xA xI xC xF yH 0.00 2.40 6.10 3.20 5.20 3.90 7.10 yB 2.40 0.00 4.10 1.20 3.20 1.90 5.10 yD 6.10 4.10 0.00 3.10 6.90 2.80 5.20 yA 3.20 1.20 3.10 0.00 4.00 0.90 4.10 yI 5.20 3.20 6.90 4.00 0.00 4.70 7.90 yC 3.90 1.90 2.80 0.90 4.70 0.00 3.80 yF 7.10 5.10 5.20 4.10 7.90 3.80 0.00 

If you want the X and Y axes to be the same, just call them up with two lists of the same labels.

+2
source

All Articles