Есть ли способ сбросить массив NumPy в файл CSV? У меня есть 2D NumPy массив и нужно сбрасывать его в удобочитаемом формате.
Дамп массива NumPy в файл csv
Ответ 1
numpy.savetxt
сохраняет массив в текстовый файл.
import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")
Ответ 2
Вы можете использовать pandas
. Требуется дополнительная память, так что это не всегда возможно, но очень быстро и просто в использовании.
import pandas as pd
pd.DataFrame(np_array).to_csv("path/to/file.csv")
если вам не нужен заголовок или индекс, используйте to_csv("/path/to/file.csv", header=None, index=None)
Ответ 3
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')
На странице руководства есть несколько полезных заметок:
Это удобная функция для быстрого хранения данных массива. Информация о порядке байтов и точности теряется, поэтому этот метод не подходит для файлов, предназначенных для архивирования данных или передачи данных между компьютерами с различным порядком байтов. Некоторые из этих проблем могут быть преодолены путем вывода данных в виде текстовых файлов за счет скорости и размера файла.
Заметка. Эта функция не создает многострочные CSV файлы, она сохраняет все в одну строку.
Ответ 4
Запись массивов записей в виде 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())
Ответ 5
, если вы хотите написать в столбце:
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)
Ответ 6
Как уже говорилось, лучший способ .savetxt(...)
массив в CSV файл - использовать .savetxt(...)
. Тем не менее, есть определенные вещи, которые мы должны знать, чтобы сделать это правильно.
Например, если у вас есть пустой массив с dtype = np.int32
как
narr = np.array([[1,2],
[3,4],
[5,6]], dtype=np.int32)
и хотите сохранить, используя savetxt
как
np.savetxt('values.csv', narr, delimiter=",")
Он будет хранить данные в экспоненциальном формате с плавающей запятой как
1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00
Вам придется изменить форматирование с помощью параметра fmt
as
np.savetxt('values.csv', narr, fmt="%d", delimiter=",")
хранить данные в оригинальном формате
Сохранение данных в сжатом формате gz
Кроме того, savetxt
может использоваться для хранения данных в сжатом формате .gz
, что может быть полезно при передаче данных по сети.
Нам просто нужно изменить расширение файла, так как .gz
и numpy позаботятся обо всем автоматически
np.savetxt('values.gz', narr, fmt="%d", delimiter=",")
Надеюсь, поможет
Ответ 7
Если вы хотите сохранить свой массив 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))
Ответ 8
Вы также можете сделать это с помощью чистого 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)
Ответ 9
Я считаю, что вы также можете сделать это довольно просто следующим образом:
- Конвертировать массив Numpy в фрейм данных Pandas
- Сохранить как CSV
например, № 1:
# Libraries to import
import pandas as pd
import nump as np
#N x N numpy array (dimensions dont matter)
corr_mat #your numpy array
my_df = pd.DataFrame(corr_mat) #converting it to a pandas dataframe
например, № 2:
#save as csv
my_df.to_csv('foo.csv', index=False) # "foo" is the name you want to give
# to csv file. Make sure to add ".csv"
# after whatever name like in the code
Ответ 10
В Python мы используем модуль csv.writer() для записи данных в файлы csv. Этот модуль похож на модуль csv.reader().
import csv
person = [['SN', 'Person', 'DOB'],
['1', 'John', '18/1/1997'],
['2', 'Marie','19/2/1998'],
['3', 'Simon','20/3/1999'],
['4', 'Erik', '21/4/2000'],
['5', 'Ana', '22/5/2001']]
csv.register_dialect('myDialect',
delimiter = '|',
quoting=csv.QUOTE_NONE,
skipinitialspace=True)
with open('dob.csv', 'w') as f:
writer = csv.writer(f, dialect='myDialect')
for row in person:
writer.writerow(row)
f.close()
Разделитель - это строка, используемая для разделения полей. Значением по умолчанию является запятая (,).
Ответ 11
Я сделал одно хранилище классов для этого: https://github.com/bigbizze/NumpyToTSV