2012-10-05 16 views
6

Sembra per me banale ma mi manca ancora un modo efficiente e "pulito" per inserire una serie di elementi appartenenti alla serie numpy (come aa[:,:]) in una stringa formattata da stampata/scritta. Infatti le estese elemento per elemento specifica sintassi piace:stringa formattata di serie di elementi di array numpy

formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,0], aa[ii,1], aa[ii,2]) 
file1.write(formattedline+'\n') 

stanno lavorando.

Ma non ho trovato altra soluzione più breve, perché:

formattedline= '%10.6f %10.6f %10.6f' % (float(aa[ii,:])) 
file1.write(formattedline+'\n') 

naturalmente dà: TypeError: only length-1 arrays can be converted to Python scalars

o:

formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,:]) 
file1.write(formattedline+'\n') 

dà: TypeError: float argument required, not numpy.ndarray. Ho provato con iteratori ma senza successo.

Ovviamente questo è interessante quando ci sono diversi elementi da stampare.

Quindi: come è possibile combinare l'iterazione su array numpy e stringa formattata?

risposta

5

Si potrebbe convertirlo in una tupla:

formattedline = '%10.6f %10.6f %10.6f' % (tuple(aa[ii,:])) 

In un caso più generale, è possibile utilizzare un join:, uso np

formattedline = ' '.join('%10.6f'%F for F in aa[ii,:]) 
+0

che è buono e funzionante! :) ... quindi la seconda soluzione sta effettivamente iterando sulla matrice numpy, molto bella. – gluuke

+0

... ma ancora, aggiungendo una stringa: 'formattedline = '% 4s% 10.6f% 10.6f% 10.6f'% (string1, (tuple (aa [ii,:]))) dà' TypeError: argomento float richiesto, non tuple' e non capisco perché – gluuke

+0

@gluuke devi aggiungerli: '(stringa1,) + tupla (aa [ii,:])'. –

2

Se si sta scrivendo l'intero array in un file .savetxt:

np.savetxt(file1, aa, fmt = '%10.6f') 

Il parametro fmt può essere un singolo formato o un SEQUENC e di formati, o una stringa multi-formato come

'%10.6f %5.6f %d' 
+0

... grazie! Ma cosa succede se non sto salvando l'intero array allo stesso tempo? ... Quindi se aggiungo porzioni di array combinate con del testo? – gluuke

+0

Quindi penso che il suggerimento di @ hayden sia il migliore. Sotto il cofano, 'np.savetxt' chiama' fh.write (asbytes (formato% tupla (row) + newline)) '. (In Python2, 'asbytes = str'.) – unutbu