2012-08-01 45 views
4

我創建在numpy的距離矩陣,用out把這樣:如何爲numpy矩陣生成乾淨的x軸和y軸?

['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. ]] 

我打印的是x軸僅通過打印列表來之前,我打印的實際矩陣,:

print" ", names 
print a 

我需要該軸的順序,因爲列表'名稱'正確地將變量與它們在矩陣中的值排序。但是,我將如何能夠在numpy中獲得類似的y軸?

+1

你是什麼意思?你想要在y方向上打印數組左側的標識符(如電子表格)嗎?或者你只是想在上面打印y標識符並在其下面打印數組的轉置(因爲數組/矩陣是對稱的,在這種情況下,它會顯示相同的內容)? – Evert 2012-08-01 13:59:28

+0

我想打印數組左邊的標識符,沿着y方向,就像我在數組頂部的x方向一樣。使用包含我需要放置的特定訂單的列表'名稱'。 – Sean 2012-08-01 14:14:35

+0

是的,x和y標識符都是相同的,因爲它是一個對稱矩陣,所以它基本上是一個反射。 – Sean 2012-08-01 14:15:16

回答

2

也不是那麼漂亮,但這個漂亮的表格打印的工作原理:

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()) 

打印:

 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 

如果你想在X和Y軸是相同的,只是把它兩個相同標籤的列表。

+0

謝謝你,完全按照需要工作! – Sean 2012-08-01 15:35:38