gpt4 book ai didi

python - pretty-print 错误栏

转载 作者:太空狗 更新时间:2023-10-29 21:57:29 26 4
gpt4 key购买 nike

我将 python 与 numpy、scipy 和 matplotlib 一起用于数据评估。作为结果,我获得了带有误差条的平均值和拟合参数。

我希望 python 能够根据给定的精度自动漂亮地打印这些数据。例如:

假设我得到结果 x = 0.012345 +/- 0.000123。当指定精度为 2 时,有没有一种方法可以自动将其格式化为 1.235(12) x 10^-2。也就是说,计算误差条中的精度,而不是值中的精度。

有谁知道提供此类功能的软件包,还是我必须自己实现?

有没有办法将其注入(inject) python 字符串格式化机制? IE。能够编写类似 "%.2N"% (0.012345, 0.0000123) 的内容。

我已经查看了 numpy 和 scipy 的文档并用谷歌搜索,但我找不到任何东西。我认为这对于处理统计数据的每个人来说都是一个有用的功能。

感谢您的帮助!

编辑:应 Nathan Whitehead 的要求,我将举几个例子。

123 +- 1         ----precision 1----->  123(1)
123 +- 1.1 ----precision 2-----> 123.0(11)
0.0123 +- 0.001 ----precision 1-----> 0.012(1)
123.111 +- 0.123 ----precision 2-----> 123.11(12)

为清楚起见,省略了 10 的幂。括号内的数字是标准错误的简写符号。括号前数字的最后一位和括号内数字的最后一位必须具有相同的小数幂。出于某种原因,我无法在网上找到对这个概念的很好解释。我唯一得到的是这篇德语维基百科文章 here 。然而,这是一种非常常见且非常方便的表示法。

编辑2:我自己实现了速记符号:

#!/usr/bin/env python
# *-* coding: utf-8 *-*

from math import floor, log10

# uncertainty to string
def un2str(x, xe, precision=2):
"""pretty print nominal value and uncertainty

x - nominal value
xe - uncertainty
precision - number of significant digits in uncertainty

returns shortest string representation of `x +- xe` either as
x.xx(ee)e+xx
or as
xxx.xx(ee)"""
# base 10 exponents
x_exp = int(floor(log10(x)))
xe_exp = int(floor(log10(xe)))

# uncertainty
un_exp = xe_exp-precision+1
un_int = round(xe*10**(-un_exp))

# nominal value
no_exp = un_exp
no_int = round(x*10**(-no_exp))

# format - nom(unc)exp
fieldw = x_exp - no_exp
fmt = '%%.%df' % fieldw
result1 = (fmt + '(%.0f)e%d') % (no_int*10**(-fieldw), un_int, x_exp)

# format - nom(unc)
fieldw = max(0, -no_exp)
fmt = '%%.%df' % fieldw
result2 = (fmt + '(%.0f)') % (no_int*10**no_exp, un_int*10**max(0, un_exp))

# return shortest representation
if len(result2) <= len(result1):
return result2
else:
return result1


if __name__ == "__main__":
xs = [123456, 12.34567, 0.123456, 0.001234560000, 0.0000123456]
xes = [ 123, 0.00123, 0.000123, 0.000000012345, 0.0000001234]
precs = [ 1, 2, 3, 4, 1]

for (x, xe, prec) in zip(xs, xes, precs):
print '%.6e +- %.6e @%d --> %s' % (x, xe, prec, un2str(x, xe, prec))

输出:

1.234560e+05 +- 1.230000e+02 @1 --> 1.235(1)e5
1.234567e+01 +- 1.230000e-03 @2 --> 12.3457(12)
1.234560e-01 +- 1.230000e-04 @3 --> 0.123456(123)
1.234560e-03 +- 1.234500e-08 @4 --> 0.00123456000(1235)
1.234560e-05 +- 1.234000e-07 @1 --> 1.23(1)e-5

最佳答案

对于仍然对此问题感兴趣的人,请参阅 gvar图书馆和here例如,OP 期望的行为(最后一部分)。

关于python - pretty-print 错误栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6671053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com