python - 如何为 numpy 矩阵生成干净的 x 和 y 轴?

标签 python arrays numpy matrix

我在 numpy 中创建一个距离矩阵,输出如下:

  ['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 轴,a:

print" ", names
print a

我需要按该顺序排列的轴,因为列表“名称”正确地对变量及其在矩阵中的值进行了排序。但是我怎样才能在 numpy 中获得类似的 y 轴?

最佳答案

它不是很漂亮,但是这张漂亮的表格打印效果很好:

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轴相同,用两个相同标签的列表调用即可。

关于python - 如何为 numpy 矩阵生成干净的 x 和 y 轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11760490/

相关文章:

python - Google 语音 API GRPC 超时

performance - 使用 TimeIt 管理设置代码

php - Drupal 7 使用 If 条件 mysql 数据库选择查询

python - Genfromtxt 文件名

python - 返回数组中子数组的索引

python - 如何更新 django Rest 框架中的 self.request.user 字段?

python - 为什么这种(​​可能更有效)动态算法的性能优于朴素递归版本?

ios - iOS Objective-c insertObject:对象atIndex:index

c - 通过删除子数组使数组左右两边的和相等

python - Numpy 数组多维索引与列表 IndexError : shape mismatch