打印2D NumPy数组时如何去除外支架

时间:2019-12-18 14:48:57

标签: python numpy printing

我有以下代码:

import numpy as np
from numpy import matrix

MM = matrix([[1.00,0,0],[0,1.50,0],[0,0,2.00]])
M = np.array(MM)
print("matrix M: \n", M)

输出如下:

matrix M: 
 [[1.  0.  0. ]
 [0.  1.5 0. ]
 [0.  0.  2. ]]

这非常美观,但我希望它看起来更有条理。希望是这样的:

[1.  0.   0.]
[0.  1.5  0.]
[0.  0.   2.]

5 个答案:

答案 0 :(得分:2)

如果您自己打印M,它实际上看起来像您期望的那样。

第一行混乱的原因是因为print默认在其参数之间插入一个空格。您可以通过提供sep=''来抑制这种情况。

请参阅https://docs.python.org/3/library/functions.html#print以供参考。

或者更好的是,从第一个打印参数中省略\n,而改用sep='\n'

>>> print("matrix M:", M, sep='\n')
matrix M: 
[[1.  0.  0. ]
 [0.  1.5 0. ]
 [0.  0.  2. ]]

答案 1 :(得分:0)

非常接近:

'\n'.join('[{}]'.format(' '.join(str(n) for n in row)) for row in M)

输出

[1.0 0.0 0.0]
[0.0 1.5 0.0]
[0.0 0.0 2.0]

这将删除缩进和双方括号。

但是,对于非常大的矩阵,由于嵌套的for循环,这可能会变慢。

答案 2 :(得分:0)

确切的期望输出是这样:

print('\n'.join('[{}]'.format('. '.join(str(float(n)) for n in row)) for row in M))

[1.0. 0.0. 0.0]
[0.0. 1.5. 0.0]
[0.0. 0.0. 2.0]

答案 3 :(得分:0)

如此处Pretty print 2D Python list 所述,以下是一个非常不错的选择:

s = [[str(e) for e in row] for row in M]
lens = [max(map(len, col)) for col in zip(*s)]
fmt = '\t'.join('{{:{}}}'.format(x) for x in lens)
table = [fmt.format(*row) for row in s]
print('\n'.join(table))

1.0     0.0     0.0
0.0     1.5     0.0
0.0     0.0     2.0

答案 4 :(得分:0)

根据这里要为解决方案增加多少代码/复杂度,您可以做一些事情。如果您确实想要对输出进行细粒度的控制(使用其他一些建议的解决方案中提供的代码),则可以在print语句中使用自定义函数,但是这种方法不那么麻烦,但仍然给您带来体面的体验灵活性是使用Numpy中已经包含的array2string函数。

一些使用您的方案的示例:

  • 不带任何参数:
>>> print(np.array2string(a=M))
[[1.  0.  0. ]
 [0.  1.5 0. ]
 [0.  0.  2. ]]
  • 使用separator参数在元素周围添加一些填充:
>>> print(np.array2string(a=M, separator='   '))
[[1.    0.    0. ]
 [0.    1.5   0. ]
 [0.    0.    2. ]]
  • 如果前括号和后括号很麻烦,您可以使用print语句(array2string并没有办法改变它)本身做进一步的说明,请进行一些操作去除括号后的字符间距:
>>> print(' ' + np.array2string(a=M, separator='   ')[1:-1])
 [1.    0.    0. ]
 [0.    1.5   0. ]
 [0.    0.    2. ]

请注意,最后一种情况在每行的开头仍留有空格。您可以使用正则表达式进行清理。

我意识到,这可能并不是您真正想要的输出,但是我想我可能会提供一种重量更轻的替代品,使您基本上能达到目标。