2014-10-09 3 views
4

Я использую numpy.savetxt() для записи массива numpy в файл csv, но файл, который сгенерирован, очень большой. Например, если я создаю массив нулей:numpy.savetxt() выводит очень большие файлы

import numpy 

test = numpy.zeros((10000,10000), dtype=numpy.float32) 
numpy.savetxt('C:/datatest.csv',test,delimiter=',') 

Я бы ожидать, что файл будет около 10000 * 10000 * 4 байт (400 MB) большой. (Это также то, что возвращает test.nbytes). Однако файл имеет размер 2,3 ГБ. Есть ли причина для большого размера файла? Я просмотрел документацию numpy, похоже, не существует способа указать тип переменной при записи в файл. Я пробовал другие типы файлов/разделителей, но получал те же результаты.

ответ

6

Размер нативного типа данных отличается от размера строкового представления типа данных.

numpy.savetxt имеет fmt аргумент, который по умолчанию '%.18e', который форматирует каждый из ваших нулей в 0.000000000000000000e+00. Это 24 символа на элемент плюс один для разделителя.

Для получения меньшего файла вы можете изменить формат (остерегайтесь потерять значимые цифры) или использовать numpy.save для сохранения в двоичном формате или numpy.savez для сохранения в виде сжатого архива.

+1

Следует подчеркнуть, что независимо от формата 'savetxt' сохраняет данные в форме * string *. Кажется, что OP полагает, что каждое значение float32 будет сохранено как 4 байта в некотором двоичном формате, но это не так. – BrenBarn

+0

Также очень важно, чтобы все нули в этом файле нуждались в 1 или 2 байтах, в зависимости от кодировки. Для всего числа float32 требуется 4 байта. (все 18 цифр) – sebix

+0

Спасибо за ответ, изменив параметр fmt, уменьшил размер! – samuelschaefer

Смежные вопросы