当我通过以下方式打印一个numpy数组时:
print('Array: ', A)
结果格式错误:
Array: [[0.0000 0.5000]
[0.0000 0.3996]]
相反,我想“正确对齐”:
Array: [[0.0000 0.5000]
[0.0000 0.3996]]
答案 0 :(得分:1)
改善显示效果的最简单方法是将标签和阵列打印分开:
In [13]: print('Array:');print(np.arange(4).reshape(2,2))
Array:
[[0 1]
[2 3]]
在
In [14]: print('Array', np.arange(4).reshape(2,2))
Array [[0 1]
[2 3]]
打印内容将字符串与数组的str
格式组合在一起:
In [15]: print('Array', str(np.arange(4).reshape(2,2)))
Array [[0 1]
[2 3]]
In [16]: str(np.arange(4).reshape(2,2))
Out[16]: '[[0 1]\n [2 3]]'
str(A)
与较大的上下文无关,因此只有较小的缩进,而不是所需的较大缩进。
要接近所需的结果,您必须自己拆分和组合这些字符串。
产生相同结果的变量:
In [19]: print('Array\n{}'.format(np.arange(4).reshape(2,2)))
Array
[[0 1]
[2 3]]
In [22]: print('Array',np.arange(4).reshape(2,2),sep='\n')
Array
[[0 1]
[2 3]]
这是我拆分和重建时要想到的:
In [26]: alist = str(np.arange(6).reshape(3,2)).splitlines()
In [27]: alist
Out[27]: ['[[0 1]', ' [2 3]', ' [4 5]]']
In [28]: header = 'Array: '; offset = ' '
In [29]: astr = [header + alist[0]]
In [30]: for row in alist[1:]:
...: astr.append(offset + row)
...:
In [31]: astr
Out[31]: ['Array: [[0 1]', ' [2 3]', ' [4 5]]']
In [32]: print('\n'.join(astr))
Array: [[0 1]
[2 3]
[4 5]]
答案 1 :(得分:1)
NumPy为此提供了一个功能:np.array2string
使用它来指定您的前缀(长度):
>>> print('Array:', np.array2string(A, prefix='Array: '))
Array: [[0. 0.5 ]
[0. 0.3996]]
要了解此函数的作用,请单独查看其输出:
>>> print(np.array2string(A, prefix='Array: '))
[[0. 0.5 ]
[0. 0.3996]]
因此,它只是在第一个之后的行缩进了前缀的长度。前缀本身不会被打印。
答案 2 :(得分:0)
复制自:How do I print an aligned numpy array with (text) row and column labels?
但是请参考Andy P的回复,请注意,您也可以在没有标签的情况下打印所有内容
这段代码本质上是上述scoffey的实现,但是它没有三个字符的限制,并且功能更强大。 这是我的代码:
def format__1(digits,num):
if digits<len(str(num)):
raise Exception("digits<len(str(num))")
return ' '*(digits-len(str(num))) + str(num)
def printmat(arr,row_labels=[], col_labels=[]): #print a 2d numpy array (maybe) or nested list
max_chars = max([len(str(item)) for item in flattenList(arr)+col_labels]) #the maximum number of chars required to display any item in list
if row_labels==[] and col_labels==[]:
for row in arr:
print '[%s]' %(' '.join(format__1(max_chars,i) for i in row))
elif row_labels!=[] and col_labels!=[]:
rw = max([len(str(item)) for item in row_labels]) #max char width of row__labels
print '%s %s' % (' '*(rw+1), ' '.join(format__1(max_chars,i) for i in col_labels))
for row_label, row in zip(row_labels, arr):
print '%s [%s]' % (format__1(rw,row_label), ' '.join(format__1(max_chars,i) for i in row))
else:
raise Exception("This case is not implemented...either both row_labels and col_labels must be given or neither.")
运行
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']
printmat(x,row_labels=row_labels, col_labels=column_labels)
给予
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]
如果'x'只是一个嵌套的python列表而不是一个numpy数组,这也将是输出。