2012-03-28 11 views
7

Chcę zapisać tablicę 2D do pliku CSV z informacjami nagłówka i kolumny "nagłówka" (jak tabela). Wiem, że mógłbym użyć argumentu nagłówka do numpy.savetxt, aby zapisać nazwy kolumn, ale czy istnieje jakaś łatwa metoda włączenia innej tablicy (lub listy) jako pierwszej kolumny danych (takich jak tytuły wierszy)?Python/Numpy - Zapisz tablicę z tytułami kolumny i wiersza

Poniżej znajduje się przykład tego, jak obecnie to robię. Czy istnieje lepszy sposób na dołączenie tych tytułów wierszy, może jakiejś sztuczki z savetxt jestem nieświadomy?

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()) 

Odpowiedz

6

Może wolisz zrobić coś takiego:

# 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') 

To jest niejawnie konwertowania data do tablicy ciągów, i trwa około 200 ms na każdy milion rzeczy w moim komputerze.

Dtype '|S20' oznacza ciągi dwudziestu znaków. Jeśli jest zbyt niska, numery dostanie posiekane:

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

Inna opcja, że ​​z moim ograniczone badanie jest wolniejszy, ale daje dużo większą kontrolę i nie ma problem siekanie będzie za pomocą np.char.mod, jak

# 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

Używanie hstack musi jednak odtworzyć tablicę w pamięci, prawda? Jeśli więc dane są bardzo duże, musimy ponownie przydzielić tę pamięć ponownie. W przypadku mojej konkretnej aplikacji jest to mało prawdopodobne, ale jest to punkt, o którym warto wspomnieć. I prawdopodobnie nie ma na to żadnego sposobu. Wydaje się, że coś, co savetxt powinno implementować wewnętrznie, nawet jeśli musi zrobić rozwiązanie podobne do mojego (ale leżące u podstaw kodu C). –

+0

Tak, masz rację. Myślę, że być może uda się uniknąć całego tego obciążenia za pomocą tablicy rekordów i używając faktu, że fmt akceptuje listę operatorów formatujących, takich jak 'fmt = ['% s', '% f', ...]', ale Nie znam ich, więc to tylko domysły. – jorgeca

+0

Ya, wziąłem pod uwagę także tablicę rekordów. Myślę, że masz rację, że można z tego skorzystać ... ale miałem nadzieję, że ich uniknę ... Chyba wybiorę tylko to, co wydaje się mniejszym zło. –

Powiązane problemy