Дамп массива NumPy в csv-файл

есть ли способ сбросить массив NumPy в CSV-файл? У меня есть 2D массив NumPy и нужно сбросить его в удобочитаемом формате.

7 ответов


numpy.savetxt сохраняет массив в текстовый файл.

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")

легко и быстро с пандами

import pandas as pd 
df = pd.DataFrame(np_array)
df.to_csv("file_path.csv")

tofile является удобной функцией для этого:

import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
a.tofile('foo.csv',sep=',',format='%10.5f')

на странице man есть несколько полезных заметок:

Это функция удобства для быстрого хранения данных массива. Информация о endianness и точности теряется, поэтому этот метод не хороший выбор для файлов, предназначенных для архивирования или транспортировки данных между машинами с различным порядком байтов. Некоторые из этих проблем могут быть преодолены путем вывода данных в виде текстовых файлов, в счет скорость и размер файла.

Примечание. Эта функция не создает многострочные csv-файлы, она сохраняет все в одну строку.


запись массивов записей в виде CSV-файлов с заголовками требует немного больше работы.

в этом примере читается CSV-файл с заголовком В первой строке, а затем записывается тот же файл.

import numpy as np

# Write an example CSV file with headers on first line
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# Read it as a Numpy record array
ar = np.recfromcsv('example.csv')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# Write as a CSV file with headers on first line
with open('out.csv', 'w') as fp:
    fp.write(','.join(ar.dtype.names) + '\n')
    np.savetxt(fp, ar, '%s', ',')

обратите внимание, что в этом примере не рассматриваются строки с запятыми. Чтобы рассмотреть кавычки для нечисловых данных, используйте csv пакет:

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

Если вы хотите писать в графе:

    for x in np.nditer(a.T, order='C'): 
            file.write(str(x))
            file.write("\n")

здесь " a "- это имя массива numpy, а "file" - переменная для записи в файл.

Если вы хотите написать в строке:

    writer= csv.writer(file, delimiter=',')
    for x in np.nditer(a.T, order='C'): 
            row.append(str(x))
    writer.writerow(row)

если вы хотите сохранить массив numpy (например,your_array = np.array([[1,2],[3,4]])) в одну ячейку, вы можете перевести его сначала с your_array.tolist().

сохраните ее обычным способом в одну ячейку, с delimiter=';' и ячейка в csv-файле будет выглядеть так [[1, 2], [2, 4]]

тогда вы можете восстановить свой массив следующим образом: your_array = np.array(ast.literal_eval(cell_string))


вы также можете сделать это с помощью pure python без использования каких-либо модулей.

# format as a block of csv text to do whatever you want
csv_rows = ["{},{}".format(i, j) for i, j in array]
csv_text = "\n".join(csv_rows)

# write it to a file
with open('file.csv', 'w') as f:
    f.write(csv_text)