【问题标题】:How to remove outer brackets when printing 2D NumPy array打印 2D NumPy 数组时如何删除外括号
【发布时间】:2019-12-18 14:48:57
【问题描述】:

我有以下代码:

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.]

【问题讨论】:

  • 您可以创建自定义的 'to_string()' 方法。遗憾的是,python 以这种方式打印 n 维数组.....
  • 您可以使用print("matrix M: \n", M, sep='') 修复输出中M 第一行的对齐方式。但是你仍然会有外部方括号。
  • @WarrenWeckesser 对,但它不会像 OP 显然想要的那样删除双方括号
  • 阅读完答案后,我现在不确定是否应该编辑标题。你的确切问题是什么?如何去掉括号?如何对齐价值观?如何去除矩阵前的空格?
  • 我会建议一个涉及更广泛值的测试用例。例如,一行中的“12.3”可能会弄乱逐行格式。默认矩阵格式的一大优点是它保持列对齐。摆脱 [] 的外部集合可能不值得付出努力。 np.matrix 始终是 2d,但其他 numpy 数组可能是 1d 或 3d。

标签: python numpy printing


【解决方案1】:

如果您单独打印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. ]]

【讨论】:

  • 看起来 OP 根本不需要方括号
  • 谢谢!双方括号无关紧要,反正看起来不错。
【解决方案2】:

非常接近:

'\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 循环,这可能会很慢。

【讨论】:

    【解决方案3】:

    正如这里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】:

      所需的确切输出是这样的:

      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]
      

      【讨论】:

        【解决方案5】:

        根据您在此处的解决方案需要多少额外代码/复杂性,您可以做一些事情。如果您真的想要对输出进行细粒度控制(使用其他一些提议的解决方案中提供的代码),您可以在 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. ]
        

        请注意,最后一个场景仍然在每行的开头留下一个空格。您可以使用正则表达式来清理它。

        我意识到这可能不是完全你正在寻找的输出方面,但我想我可能会提供一个更轻的替代方案,让你大部分时间都在那里。

        【讨论】:

          猜你喜欢
          • 2012-03-10
          • 2019-02-23
          • 2018-01-13
          • 2018-02-25
          • 1970-01-01
          • 2018-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多