如何打印带行列标签的对齐numpy数组?
有没有什么优雅的方法可以利用 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 notebook 和 Pandas 来实现这个功能。首先,在 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)
然后查看这个数据框:
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的文档中找到详细说明。