python - красивые панели ошибок печати

Я использую python с numpy, scipy и matplotlib для оценки данных. В результате я получаю средние значения и соответствующие параметры с помощью полос ошибок.

Я бы хотел, чтобы python автоматически распечатывал эти данные в соответствии с заданной точностью. Например:

Предположим, я получил результат x = 0,012345 +/- 0,000123 . Есть ли способ автоматически отформатировать это как 1,235 (12) x 10 ^ -2 , когда была указана точность 2. То есть, считая точность на панели ошибок,а не в значении.

Кто-нибудь знает пакет, который предоставляет такую ​​функциональность, или мне придется реализовать это самостоятельно?

Есть ли способ внедрить это в механизм форматирования строк python? Т.е. возможность написать что-то вроде "%. 2N"% (0.012345, 0.0000123) .

Я уже просматривал документы numpy и scipy и искал в Google, но ничего не нашел. Думаю, это будет полезная функция для всех, кто занимается статистикой.

Спасибо за вашу помощь!

EDIT: По просьбе Натана Уайтхеда я приведу несколько примеров.

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)

Степень десяти опущена для ясности. Число в скобках является сокращенным обозначением стандартной ошибки. Последняя цифра числа перед скобками и последняя цифра числа внутри скобок должны иметь одинаковую десятичную степень. По какой-то причине я не могу найти хорошее объяснение этой концепции в Интернете. Единственное, что у меня есть, это статья в немецкой Викпедии здесь . Однако это довольно распространенная и очень удобная запись.

EDIT2: Я сам реализовал сокращенную нотацию:

#!/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

8
задан Lemming 15 July 2011 в 00:28
поделиться