【问题标题】:Python print aligned numpy arrayPython打印对齐的numpy数组
【发布时间】:2018-07-13 14:18:05
【问题描述】:

当我通过以下方式打印一个 numpy 数组时:

print('Array: ', A)

结果格式错误:

Array: [[0.0000 0.5000]
 [0.0000 0.3996]]

相反,我想“正确”对齐:

Array: [[0.0000 0.5000]
        [0.0000 0.3996]]

【问题讨论】:

    标签: python-3.x numpy


    【解决方案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】:

      改善显示的最简单方法是将标签和数组打印分开:

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

      print 将字符串与数组的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]]
      

      【讨论】:

        【解决方案3】:

        复制自: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 数组,这也是输出。

        【讨论】:

        • 另请注意,如果您想要标签,则需要使用此代码同时使用列标签和行标签。只有其中一个不起作用
        猜你喜欢
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多