Python/Numpy-сохранить массив с заголовками столбцов и строк

Я хочу сохранить 2D-массив в CSV-файл с информацией о строке и столбце "заголовок" (например, таблица). Я знаю, что могу использовать аргумент header для numpy.savetxt для сохранения имен столбцов, но есть ли простой способ также включить какой-либо другой массив (или список) в качестве первого столбца данных (например, заголовки строк)?

Ниже приведен пример того, как я это делаю в настоящее время. Есть ли лучший способ включить эти названия строк, возможно, какой-то трюк с savetxt, о котором я не знаю?

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

1 ответов


может быть, вы предпочтете сделать что-то вроде этого:

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

это неявное преобразование data к массиву строк и занимает около 200 мс для каждого миллиона элементов на моем компьютере.

в dtype '|S20' означает строки из двадцати символов. Если он слишком низкий, ваши номера будут рубить:

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

другой вариант, что из моего ограниченного тестирования медленнее, но дает вам гораздо больше контроля и не проблема измельчения будет использовать np.char.mod, как

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