在Python中统一设置数字格式

在Python中统一设置数字格式,python,numpy,matplotlib,string-formatting,Python,Numpy,Matplotlib,String Formatting,我有一系列数字: from numpy import r_ r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)] 我希望它们以如下形式显示在绘图图例中: a 10^(b) (带^表示上标) 例如,第三个数字变成3 10^(-3) 我知道我必须使用Python的字符串格式操作符%,但我看不出有什么方法可以做到这一点。有人能告诉我怎么做(或给我一个替代方法)吗?如果您确定小数点后不需要超过一个固定的位数,

我有一系列数字:

from numpy import r_
r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)]
我希望它们以如下形式显示在绘图图例中:

a 10^(b)
(带
^
表示上标)

例如,第三个数字变成
3 10^(-3)


我知道我必须使用Python的字符串格式操作符
%
,但我看不出有什么方法可以做到这一点。有人能告诉我怎么做(或给我一个替代方法)吗?

如果您确定小数点后不需要超过一个固定的位数,那么:

>>> from numpy import r_
>>> a = r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)]
>>> for x in a: print "%.1e"%x
... 
1.0e-09
1.0e-03
3.0e-03
6.0e-03
9.0e-03
1.5e-02
这里的问题是,如果您使用
%.0e
作为格式,最后一个数字将打印为
1e-2

编辑:由于您使用的是
matplotlib
,因此情况就不同了:您可以使用TeX渲染引擎。一个快速而肮脏的例子:

fig = plt.figure()
ax = fig.add_subplot(111)

x = 1.5*10**(-2)
l = ("%.0e"%x).split("e")
x_str = r"$ %s \times 10^{%s}$" % (l[0], l[1] )

ax.set_title(x_str)

plt.show()
使用新的
.format
字符串格式确实会更干净一些

EDIT2:为了完整性和将来的参考,以下是我对OP评论的看法:

x = 1.5*10**(-2)
l = ("%.0e"%x).split("e")
x_str = r"$%s \times 10^{%s}$" % ( l[0], str(int(l[1])) )
这里我将转换为int并返回以避免前导零:
-02
->
-2

list_item = (multiply_number,degree_number)
displayed_items = [list_item, list_item, ....]
for item in displayed_items:
   print '{0}*10^({1})'.format(*item)

创建具有要显示的编号的元组列表。然后使用format()输出它们。不要忘记使用*(用于使用元组中的每个项)。

您也可以尝试str.format-如何创建绘图?它只是一些ASCII艺术,比如plot,还是您正在使用
matplotlib
或其他库?
'%s 10^(%s)'(number1,number2)
有效吗?@Bakuriu我正在使用
matplotlib
。我会加上标签。我相信这不是他想要的。我看这里没有上标。有没有办法1)把指数放在上标,2)把
e
换成
10
?@Zhenya好的,我马上就到了。问题是
frexp
返回base-2分解,这不是我想要的。我似乎找不到frexp10或同等产品。格式字符串的方式是:
'{0}.10^{1}'。格式(round(f,1,e)
,它只留下上标由TeX排版。@rubenv:是的,的确,我说的是错的,它是一个基数为2的指数。好的,只需在
e
上拆分字符串,然后将其收集在一起——将其编辑为答案。@rubenvb:我现在得到的仍然是脏的,因为它在基数为10的指数(e^{-01}等)中留下了额外的零。