如何打印带行列标签的对齐numpy数组?

16 投票
4 回答
39090 浏览
提问于 2025-04-16 12:06

有没有什么优雅的方法可以利用 print numpy.array 的正确间距功能,来生成一个带有合适标签的二维数组,并且能够正确对齐?比如,给定一个有4行5列的数组,我该如何提供这个数组以及对应行和列标题的合适大小的列表,以生成看起来像这样的输出呢?

      A   B   C   D   E
Z [[ 85  86  87  88  89]
Y  [ 90 191 192  93  94]
X  [ 95  96  97  98  99]
W  [100 101 102 103 104]]

如果我直接尝试:

import numpy
x = numpy.array([[85, 86, 87, 88, 89], \
                 [90, 191, 192, 93, 94], \
                 [95, 96, 97, 98, 99], \
                 [100,101,102,103,104]])

row_labels = ['Z', 'Y', 'X', 'W']


print "     A   B   C   D   E"
for row, row_index in enumerate(x):
    print row_labels[row_index], row

我得到的是:

      A   B   C   D   E
Z  [85  86  87  88  89]
Y  [90 191 192  93  94]
X  [95  96  97  98  99]
W  [100 101 102 103 104]

有没有什么办法可以让我这些东西智能地对齐?如果有更好的方法解决我的问题,我当然愿意使用其他库。

4 个回答

6

这里有一种利用数组打印功能的方法。我可能不会真的用它,但它几乎能满足你的需求!

a = np.random.rand(5,4)
x = np.array('col1 col2 col3 col4'.split())
y = np.array('row1 row2 row3 row4 row5'.split())
b = numpy.zeros((6,5),object)
b[1:,1:]=a
b[0,1:]=x
b[1:,0]=y
b[0,0]=''
printer = np.vectorize(lambda x:'{0:5}'.format(x,))
print printer(b).astype(object)

[[     col1 col2 col3 col4]
 [row1 0.95 0.71 0.03 0.56]
 [row2 0.56 0.46 0.35 0.90]
 [row3 0.24 0.08 0.29 0.40]
 [row4 0.90 0.44 0.69 0.48]
 [row5 0.27 0.10 0.62 0.04]]
26

你可以使用 IPython notebookPandas 来实现这个功能。首先,在 IPython notebook 中输入你的原始示例:

import numpy
x = numpy.array([[85, 86, 87, 88, 89], 
                 [90, 191, 192, 93, 94], 
                 [95, 96, 97, 98, 99], 
                 [100,101,102,103,104]])

row_labels = ['Z', 'Y', 'X', 'W']
column_labels = ['A', 'B', 'C', 'D', 'E']

接着,创建一个数据框(DataFrame):

import pandas
df = pandas.DataFrame(x, columns=column_labels, index=row_labels)

然后查看这个数据框:

enter image description here

10

假设所有的矩阵数字最多有3位数,你可以用下面的代码替换最后的部分:

print "     A   B   C   D   E"
for row_label, row in zip(row_labels, x):
    print '%s [%s]' % (row_label, ' '.join('%03s' % i for i in row))

这段代码的输出结果是:

     A   B   C   D   E
Z [ 85  86  87  88  89]
Y [ 90 191 192  93  94]
X [ 95  96  97  98  99]
W [100 101 102 103 104]

使用 '%03s' 进行格式化,会生成一个长度为3的字符串,并在左边用空格填充。如果你想要长度为4的字符串,可以用 '%04s',以此类推。关于完整的格式字符串语法,可以在Python的文档中找到详细说明。

撰写回答