2013-02-22 17 views
5

ho una serie di numeri:Formattazione di numeri costantemente in Python

from numpy import r_ 
r_[10**(-9), 10**(-3), 3*10**(-3), 6*10**(-3), 9*10**(-3), 1.5*10**(-2)] 

e vorrei mostrarli nella leggenda di una trama nella forma:

a 10^(b) 

(con ^ significa apice

in modo che ad es. il terzo numero diventa 3 10^(-3).

So che devo usare l'operatore di formattazione delle stringhe di Python % per questo, ma non vedo un modo per farlo. Qualcuno può mostrarmi come (o mostrarmi un modo alternativo)?

+0

puoi anche provare str.format - http://docs.python.org/2/library/string.html#formatstrings – dmg

+0

Come stai creando la trama? E 'solo una trama simile ad ASCII o stai usando 'matplotlib' o altre librerie? – Bakuriu

+0

funziona ''% s 10^(% s)'% (numero1, numero2)' funziona? – dmg

risposta

6

Se si è sicuri che non è necessario più di un numero fisso di posti dopo il punto decimale, quindi:

>>> 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 

Il fermo qui è che si dovesse utilizzare %.0e come formato, l'ultima numero sarebbe essere stampato come 1e-2

EDIT: Dal momento che si sta utilizzando matplotlib, allora è una storia diversa: è possibile utilizzare il motore di rendering di TeX. Un esempio veloce-e-sporco:

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() 

che sarebbe davvero un po 'più pulito con la nuova formattazione .format stringa.

EDIT2: Solo per completezza e riferimento futuro, qui è il mio introito sulla strada del PO dai commenti:

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

Qui sto conversione in un int e indietro per evitare gli zeri iniziali: -02 - >-2 ecc

+0

Credo che questo non sia quello che voleva. Non vedo nessun apice qui. – Bakuriu

+0

C'è un modo per 1) mettere l'esponente in apice, e 2) sostituire 'e' con un' 10'? – rubenvb

+0

@rubenvb vedere la mia risposta modificata. –

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

Crea elenco di tupels con il numero che si desidera visualizzare. E basta emetterli usando format(). Non dimenticare di usare * (questo per usare ogni oggetto in tupla).