2013-05-10 67 views
10

Tôi phải chuyển đổi mảng nổi cho một chuỗi (để lưu trữ trong SQL DB) và sau đó cũng chuyển đổi chuỗi đó thành mảng nổi numpy.Chuyển đổi mảng numpy thành chuỗi CSV và chuỗi CSV trở lại thành mảng cố định

Đây là cách tôi sẽ thành một chuỗi()

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

Vì vậy, trước hết điều này không làm việc, nó là một cách tốt để đi đâu? Đó có phải là cách tốt hơn để loại bỏ dấu phẩy cuối cùng đó không? Hoặc tôi có thể lấy phương thức join để chèn dấu phẩy cho tôi?

Sau đó, thứ hai, quan trọng hơn, có cách nào thông minh để lấy từ chuỗi trở lại mảng nổi không?

Dưới đây là một ví dụ về mảng và chuỗi:

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 yes và mất độ chính xác từ %.5f là hoàn toàn tốt đẹp, những giá trị được suy bởi các điểm ban đầu chỉ có 4 chữ số thập phân vị trí chính xác vì vậy tôi không cần phải đánh bại điều đó. Vì vậy, khi khôi phục mảng NumPy, tôi rất vui khi chỉ nhận được 5 chữ số thập phân vị trí chính xác (rõ ràng là tôi giả sử)

+1

Bạn có thể kiểm tra chức năng savetxt và loadtxt gọn gàng – Matt

+0

@MattAnderson Có cách nào để sử dụng chúng để đặt văn bản thẳng vào chuỗi và tải thẳng ra khỏi chuỗi trong bộ nhớ thay vì sử dụng tệp không? – Dan

Trả lời

20

Trước tiên, bạn nên sử dụng join cách này để tránh những vấn đề dấu phẩy cuối:

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

Sau đó, để đọc nó trở lại, sử dụng numpy.fromstring:

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

Hoàn hảo, cảm ơn! – Dan

+0

Đề xuất chức năng rất đẹp @Boud. – Pramit

+0

Bạn được chào đón @Pramit: gấu trúc đủ mạnh để khiến người dùng quên các tính năng khó khăn bên dưới – 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, đặt chuỗi làm bộ đệm tệp ... cách để đi. Biết phải có một số cách thông minh có – Matt

+0

Điều này là khá giống với phương pháp 5 từ liên kết tôi đăng, tôi cho rằng tôi nên đã nhận thấy nó. Cảm ơn. Tôi sẽ gắn bó với phương pháp của Boud có lẽ là – Dan

+0

@ Không thực sự vì tất cả các hoạt động trong mã của tôi đều được thực hiện ở cấp 'C' nên nó có thể nhanh hơn, tránh né bánh xe bằng cách sử dụng các hàm' numpy' . – jamylak

4

Nếu bạn muốn có một số chuỗi đại diện nào (không nhất thiết phải CSV), bạn có thể thử này, mà tôi đã được sử dụng:

import numpy, json 

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

Nó hoạt động cho các kiểu dữ liệu phổ biến nhất.

+1

+1 Điều này khá thú vị, đặc biệt nếu bạn cần giữ độ chính xác. – Dan

Các vấn đề liên quan