2013-05-10 18 views
10

Muszę konwertować numpy tablicę float na ciąg znaków (do przechowywania w SQL DB), a następnie przekonwertować ten sam ciąg z powrotem do numpy zmienna tablica.Konwertuj tablicę numpy na ciąg CSV i ciąg znaków CSV z powrotem na tablicę numpy

To jest jak idę do łańcucha()

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

Więc po pierwsze to działa, czy jest to dobra droga? Czy jest to lepszy sposób na pozbycie się tego ostatniego przecinka? Czy mogę uzyskać dla mnie metodę join wstawiania przecinków?

Po drugie, co ważniejsze, czy istnieje sprytny sposób na przejście od łańcucha do tablicy typu float?

Oto przykład z tablicy i napis:

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' 

Aha i utrata precyzji z %.5f jest całkowicie w porządku, te wartości są interpolowane przez pierwotnych punktów mieć miejsce jedynie precyzji 4 dziesiętny więc nie muszę tego pokonać. Więc kiedy odzyskania tablicy numpy, jestem szczęśliwy, aby uzyskać jedyne miejsce precyzję 5 dziesiętną (oczywiście ja przypuszczam)

+1

Możesz sprawdzić funkcje numpy savetxt i loadtxt – Matt

+0

@MattAnderson Czy istnieje sposób na ich użycie, aby umieścić tekst prosto w ciągach znaków i wczytać go prosto z łańcuchów w pamięci, zamiast używać plików? – Dan

Odpowiedz

20

Najpierw trzeba zastosować join ten sposób uniknąć ostatnią kwestię przecinkami:

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

Następnie do czytać go ponownie, użyj numpy.fromstring:

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

Idealne, dzięki! – Dan

+0

Bardzo ładna sugestia dotycząca funkcji @Boud. – Pramit

+0

Nie ma za co. @Pramit: panda jest wystarczająco potężna, aby użytkownicy zapomnieli numpy funkcji pod – 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, ustaw ciąg jako bufor pliku ... do zrobienia. Wiedziałem, że powinien tam być jakiś sprytny sposób. – Matt

+0

To jest bardzo podobne do metody 5 z linku, który napisałem, przypuszczam, że powinienem był to zauważyć. Dzięki. Zamierzam trzymać się metody Bouda prawdopodobnie – Dan

+0

@Dan naprawdę nie, ponieważ wszystkie operacje w moim kodzie są wykonywane na poziomie 'C' więc Prawdopodobnie będzie szybciej, a także uniknie ponownego odkrywania koła za pomocą funkcji' numpy' . – jamylak

4

Jeśli chcesz jakąś reprezentację ciąg ogóle (niekoniecznie CSV), można spróbować tego, co używam:

import numpy, json 

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

Działa dla większości typowych typów danych.

+1

+1 To jest całkiem fajne, zwłaszcza jeśli chcesz zachować precyzję. – Dan

Powiązane problemy