我有浮点格式的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
有没有快速简便的方法来指定这种输出格式? 谢谢!
答案 0 :(得分:0)
您有两种字符串格式选项。
str.format()
,例如'{:16.8E}'.format(4.5)
'%16.8E' % (4.5,)
前者推荐用于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
>>>