以 5E16.8 格式打印一维数组
Printing a 1d array in 5E16.8 formatting
我有一个浮点格式的一维值数组,我需要以 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
有没有快速简便的方法来指定这种输出格式?
谢谢!!
您有两种字符串格式化选项。
str.format()
,例如'{:16.8E}'.format(4.5)
- 百分比运算符,例如
'%16.8E' % (4.5,)
前者推荐用于 Python 3.x 和任何高于 2.6 的版本。百分比运算符可用于向后兼容 Python 2.5 或更低版本。如需进一步讨论您应该使用哪一个以及在何处使用,read here. For some quick examples on how to format strings, check the documentation 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
您可以使用 itertools 中的 formatting of string until you get the desire result, and as you want 5 per line, of the many way you can do that, you can use the 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
>>>
我有一个浮点格式的一维值数组,我需要以 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
有没有快速简便的方法来指定这种输出格式? 谢谢!!
您有两种字符串格式化选项。
str.format()
,例如'{:16.8E}'.format(4.5)
- 百分比运算符,例如
'%16.8E' % (4.5,)
前者推荐用于 Python 3.x 和任何高于 2.6 的版本。百分比运算符可用于向后兼容 Python 2.5 或更低版本。如需进一步讨论您应该使用哪一个以及在何处使用,read here. For some quick examples on how to format strings, check the documentation 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
您可以使用 itertools 中的 formatting of string until you get the desire result, and as you want 5 per line, of the many way you can do that, you can use the 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
>>>