以5E16.8格式打印1d数组

时间:2016-01-22 22:38:09

标签: python string-formatting

我有浮点格式的1d值数组,我需要以5E16.8格式打印这些值(每行5个条目,实际格式,每个条目16个空格),如下所示

  7.49381113E-01  1.87971394E-14  8.19110455E-01 -2.75795136E-16 -1.12488769E-16
  1.64873995E-01 -7.45597632E-02 -2.34514676E-15 -3.14121102E-17  6.96946913E-02

有没有快速简便的方法来指定这种输出格式? 谢谢!

2 个答案:

答案 0 :(得分:0)

您有两种字符串格式选项。

  1. str.format(),例如'{:16.8E}'.format(4.5)
  2. 百分比运算符,例如'%16.8E' % (4.5,)
  3. 前者推荐用于Python 3.x以及任何高于2.6的版本。百分比运算符可用于向后兼容Python 2.5或更低版本。有关您应该使用哪一个以及在哪里read here进一步讨论。有关如何格式化字符串的一些简单示例,请查看文档here

    我将使用str.format()继续我的回答,但使用其他选项会产生非常类似的方法。

    '{:16.8E}'是你需要的,所以你想为整行重复这5次,并分别传递5个元素进行打印。

    fmt = '{:16.8E}'
    line_fmt = fmt * 5
    print(line_fmt.format(*arr[0:5])) # `arr` is the name of your 1d array
    

    语法*arr[0:5]解压缩值。这有效地传递了5个不同的参数arr[0], arr[1], arr[2], arr[3], arr[4],而不是一个包含5个元素的数组。

    您可以在循环中重复使用它来打印任意数量的线条。但是,如果您打算打印所有元素,通过准备字符串格式以便每五个项目都有换行符,可以更快地一次打印它们。

    import numpy as np
    
    items_per_line = 5
    
    np.random.seed(1024)
    arr = np.random.random(size=12)
    
    fmt = '{:16.8E}'
    line_fmt = items_per_line * fmt
    
    arr_fmt = [line_fmt] * (arr.shape[0] // items_per_line)
    remainder = arr.shape[0] % items_per_line
    if remainder:
        arr_fmt.append(remainder * fmt)
    arr_fmt = '\n'.join(arr_fmt)
    
    print(arr_fmt.format(*arr))
    

    结果

      6.47691231E-01  9.96913580E-01  5.18803264E-01  6.58112731E-01  5.99063472E-01
      7.53067334E-01  1.36247128E-01  4.11711641E-03  1.49508880E-01  6.98439001E-01
      5.93352562E-01  8.99915349E-01
    

答案 1 :(得分:0)

你可以使用formatting of string玩,直到你获得所需的结果,并且你想要的每行数为5,你可以使用来自itertools的gruper recipe并执行像这样的东西:

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

def my_print(data,size=5):
    for group in grouper(data,size):
        print( " ".join( "{: .8e}".format(x) for x in group if x is not None) )

在这个中,我当时采用5个元素组,并将组中的每个数字转换为"{: .8e}".format(x)所需的格式,然后将它们连接在一起

测试

>>> test=[0.749381113, 1.87971394e-14, 0.819110455, -2.75795136e-16, -1.12488769e-16, 0.164873995, -0.0745597632, -2.34514676e-15, -3.14121102e-17, 0.0696946913, 0.0, 0.00002541]
>>> my_print(test)
 7.49381113e-01  1.87971394e-14  8.19110455e-01 -2.75795136e-16 -1.12488769e-16
 1.64873995e-01 -7.45597632e-02 -2.34514676e-15 -3.14121102e-17  6.96946913e-02
 0.00000000e+00  2.54100000e-05
>>>