2012-03-28 52 views
7

Tôi muốn lưu một mảng 2D vào tệp CSV với thông tin "tiêu đề" hàng và cột (như bảng). Tôi biết rằng tôi có thể sử dụng đối số tiêu đề để numpy.savetxt để lưu tên cột, nhưng có cách nào dễ dàng để bao gồm một số mảng (hoặc danh sách) khác làm cột dữ liệu đầu tiên (như tiêu đề hàng) không?Python/Numpy - Lưu mảng với tiêu đề cột và hàng

Dưới đây là ví dụ về cách tôi hiện đang thực hiện. Có cách nào tốt hơn để bao gồm những tiêu đề hàng, có lẽ một số trick với savetxt tôi không biết?

import csv 
import numpy as np 

data = np.arange(12).reshape(3,4) 
# Add a '' for the first column because the row titles go there... 
cols = ['', 'col1', 'col2', 'col3', 'col4'] 
rows = ['row1', 'row2', 'row3'] 

with open('test.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerow(cols) 
    for row_title, data_row in zip(rows, data): 
     writer.writerow([row_title] + data_row.tolist()) 

Trả lời

6

Có lẽ bạn muốn làm một cái gì đó như thế này:

# Column of row titles 
rows = np.array(['row1', 'row2', 'row3'], dtype='|S20')[:, np.newaxis] 
with open('test.csv', 'w') as f: 
    np.savetxt(f, np.hstack((rows, data)), delimiter=', ', fmt='%s') 

này được ngầm chuyển đổi data tới một mảng của chuỗi, và mất khoảng 200 ms cho mỗi triệu mục trong máy tính của tôi.

Dtype '|S20' có nghĩa là chuỗi gồm hai mươi ký tự. Nếu đó là quá thấp, con số của bạn sẽ được băm nhỏ:

>>> np.asarray([123], dtype='|S2') 
array(['12'], 
    dtype='|S2') 

Một lựa chọn khác, mà từ thử nghiệm hạn chế của tôi là chậm hơn, nhưng cung cấp cho bạn kiểm soát nhiều hơn và không có vấn đề chặt sẽ được sử dụng np.char.mod, như

# Column of row titles 
rows = np.array(['row1', 'row2', 'row3'])[:, np.newaxis] 
str_data = np.char.mod("%10.6f", data) 
with open('test.csv', 'w') as f: 
    np.savetxt(f, np.hstack((rows, str_data)), delimiter=', ', fmt='%s') 
+0

Việc sử dụng hstack phải tạo lại mảng trong bộ nhớ, đúng không? Vì vậy, nếu dữ liệu rất lớn, thì chúng ta phải phân bổ lại bộ nhớ đó. Đối với ứng dụng cụ thể của tôi, đó không phải là bất kỳ vấn đề thực sự, nhưng chỉ là một điểm đáng nói đến. Và có lẽ không có cách nào xung quanh chuyện này. Nó có vẻ như một cái gì đó mà savetxt nên thực hiện trong nội bộ, ngay cả khi nó phải làm một giải pháp tương tự như tôi (nhưng trong mã C cơ bản). –

+0

Vâng, bạn nói đúng. Tôi nghĩ rằng có lẽ tất cả các chi phí này có thể tránh được với một mảng bản ghi, và sử dụng thực tế là fmt chấp nhận một danh sách các toán tử định dạng, như 'fmt = ['% s', '% f', ...]', nhưng Tôi không quen thuộc với họ, và vì vậy đây chỉ là một phỏng đoán. – jorgeca

+0

Ya, tôi cũng đã xem xét một mảng bản ghi. Tôi nghĩ rằng bạn nói đúng, rằng nó có thể được sử dụng ... nhưng tôi đã hy vọng để tránh chúng ... Tôi đoán tôi sẽ chỉ chọn bất cứ điều gì có vẻ là ít hơn của hai tệ nạn. –

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