2013-05-10 28 views
10

Devo convertire una serie numpy di float in una stringa (da memorizzare in un DB SQL) e poi anche convertire la stessa stringa in un array numpy float.Convertire un array numpy in una stringa CSV e una stringa CSV in un array numpy

Ecco come ho intenzione di una stringa()

VIstring = ''.join(['%.5f,' % num for num in VI]) 
VIstring= VIstring[:-1] #Get rid of the last comma 

Quindi in primo luogo questo funziona, è un buon modo per andare? Il loro è un modo migliore per sbarazzarsi di quest'ultima virgola? Oppure posso ottenere il metodo join per inserire le virgole per me?

In secondo luogo, ancora più importante, c'è un modo intelligente per passare dalla stringa a un array float?

Ecco un esempio della matrice e la stringa:

VI 
array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 
     16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 
     14.64359494, 14.25624062, 13.87465893, 13.49884988, 
     13.12881346, 12.76454968, 12.40605854, 12.00293814, 
     11.96379322, 11.96272486, 11.96142533, 11.96010489, 
     11.95881595, 12.26924591, 12.67548634, 13.08158864, 
     13.4877041 , 13.87701221, 14.40238245, 14.94943786, 
     15.49364166, 16.03681428, 16.5498035 , 16.78362298, 
     16.90331119, 17.02299387, 17.12193689, 17.09448654, 
     17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) 

VIstring 
'17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368' 

Oh sì e la perdita di precisione dal %.5f è totalmente soddisfacente, questi valori sono interpolati dai punti originali hanno solo 4 decimale precisione quindi non ho bisogno di batterlo. Così, quando il recupero della matrice NumPy, sono felice di ottenere solo 5 decimale di precisione (ovviamente suppongo)

+1

È possibile controllare le funzioni numetide di salvataggio e caricamento di testo – Matt

+0

@MattAnderson C'è un modo per usarle per inserire il testo direttamente nelle stringhe e caricarlo direttamente dalle stringhe in memoria anziché utilizzare i file? – Dan

risposta

20

In primo luogo si dovrebbe usare join questo modo per evitare l'ultimo numero virgola:

VIstring = ','.join(['%.5f' % num for num in VI]) 

Poi leggere di nuovo, utilizzare numpy.fromstring:

np.fromstring(VIstring, sep=',') 
+0

Perfetto, grazie! – Dan

+0

Suggerimento di funzione molto bello @Boud. – Pramit

+0

Prego @Pramit: panda è abbastanza potente da far dimenticare agli utenti le funzionalità di numpy sotto – Boud

6
>>> import numpy as np 
>>> from cStringIO import StringIO 
>>> VI = np.array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 
     16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 
     14.64359494, 14.25624062, 13.87465893, 13.49884988, 
     13.12881346, 12.76454968, 12.40605854, 12.00293814, 
     11.96379322, 11.96272486, 11.96142533, 11.96010489, 
     11.95881595, 12.26924591, 12.67548634, 13.08158864, 
     13.4877041 , 13.87701221, 14.40238245, 14.94943786, 
     15.49364166, 16.03681428, 16.5498035 , 16.78362298, 
     16.90331119, 17.02299387, 17.12193689, 17.09448654, 
     17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) 
>>> s = StringIO() 
>>> np.savetxt(s, VI, fmt='%.5f', newline=",") 
>>> s.getvalue() 
'17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368,' 
>>> np.fromstring(s.getvalue(), sep=',') 
array([ 17.95024, 17.51671, 17.08895, 16.66696, 16.25074, 15.84029, 
     15.43562, 15.03672, 14.64359, 14.25624, 13.87466, 13.49885, 
     13.12881, 12.76455, 12.40606, 12.00294, 11.96379, 11.96272, 
     11.96143, 11.9601 , 11.95882, 12.26925, 12.67549, 13.08159, 
     13.4877 , 13.87701, 14.40238, 14.94944, 15.49364, 16.03681, 
     16.5498 , 16.78362, 16.90331, 17.02299, 17.12194, 17.09449, 
     17.00066, 16.93006, 16.9723 , 17.21697, 17.75368]) 
+0

ah, impostare la stringa come buffer di file ... strada da percorrere. Sapeva che ci dovrebbe essere un modo intelligente lì – Matt

+0

Questo è molto simile al metodo 5 dal link che ho postato, suppongo che avrei dovuto notarlo. Grazie. Ho intenzione di attaccare con il metodo di Boud probabilmente – Dan

+0

@Dan non proprio dal momento che tutte le operazioni nel mio codice sono eseguite a livello 'C' quindi è probabile che sia più veloce, inoltre evita di reinventare la ruota usando le funzioni' numpy' . – jamylak

4

Se volete qualche rappresentazione di stringa di sorta (non necessariamente CSV), si potrebbe provare questo, che ho utilizzato:

import numpy, json 

## arr is some numpy.ndarray 
s = json.dumps(arr.tolist()) 
arrback = numpy.array(json.loads(s)) 

Funziona con i tipi di dati più comuni.

+1

+1 Questo è piuttosto interessante, soprattutto se è necessario mantenere la precisione. – Dan