Как экспортировать массив NumPy в CSV без включения имени файла в файл - PullRequest
0 голосов
/ 03 июня 2019

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

Пока я пробовал

pd.DataFrame(array).to_csv('test.csv.gz', header=False, index=False, float_format='%d') 

и следующее:

np.savetxt('test.csv.gz', array, fmt='%d', delimiter=',')
np.savetxt('test.csv.gz', array, fmt='%d', delimiter=',', header=None)
np.savetxt('test.csv.gz', array, fmt='%d', delimiter=',', header='')

но не повезло.

Когда я открываю файл .csv в iOS Numbers, ожидаемая матрица в обычных строках иФормат столбцов, но в ненумерованной строке все само по себе является именем файла, и это создает проблемы для следующего шага в конвейере.

Что я могу сделать?Спасибо.

Редактировать: Спасибо за первый набор комментариев.Затем я делаю файл csv, помещая его в Amazon SageMaker, чтобы я мог создать модель и конечную точку.Вот ошибка, которая возникает в генерируемом csv-файле:

ClientError: в числовой строке '��w in \ �test.csv��K��8н найдено нечисловое значение' w '�R�ȹ��zU @ ��gYɇ�` ... 'файла' test.csv.gz '.Формат CSV не требует заголовка в нем.Если строка заголовка уже удалена, XGBoost не принимает нечисловые значения в данных.

Я использовал номера iOS, чтобы увидеть, как экспортируется файл csv и в чем может быть проблема.Спасибо.

Edit2: вот верхний левый угол массива.

np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

Edit3: вывод из .csv.gz в текстовом редакторе с последующим выводом из .csv

0,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0
3,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0
3,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
1,0,0,0,0,0,0,0,0,0
2,0,0,0,0,0,0,0,0,0

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Сообщение об ошибке показывает:

'�w��\�test.csv��K��8н�R�ȹ��zU@��gYɇ�`...' 

в качестве строки заголовка.Символ \ и имя файла позволяют предположить, что программа пытается обработать сжатый GZIP-файл, не распаковывая его.В некоторых системах достаточно волшебства, чтобы прозрачно сжимать и распаковывать файлы, в некоторых нет.

Из их документации pandas.to_csv и numpy.savetext автоматически сжимают свои выходные данные, когда им передается имя файла, оканчивающееся на .gz.Это даже подтверждается вашим комментарием

с использованием .gz, поскольку он уменьшает размер файлов в 1000 раз

Проблема в том, что при попытке загрузить егов SageMaker он пытается прочитать его напрямую и задыхается, потому что первые байты не являются байтами (несжатого) CSV-файла.

Возможно, он работал бы, если бы все еще где-то в цепочке обработки,файл был тихо распакован.Известно, что многие инструменты переноса могут сжимать / распаковывать файлы на лету.

Как исправить:

  1. не сжимать файл во время генерации и гарантировать, что он никогда не будетсжатый

или

ничего не меняйте во время генерации, но убедитесь, что файл будет распакован (gunzip) перед загрузкой в ​​SageMaker
0 голосов
/ 03 июня 2019

Чтобы проиллюстрировать gzip-функцию savetxt:

In [2]: np.savetxt('foo.txt.gz',np.arange(12).reshape(3,4))                                                              

Если посмотреть на файл в виде простого текста, мы увидим имя:

In [3]: cat foo.txt.gz                                                                                                   
��\�foo.txt2�3���

У собственных загрузчиков Numpy нет проблем сэти файлы:

In [4]: np.loadtxt('foo.txt.gz')                                                                                         
Out[4]: 
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])
In [5]: np.genfromtxt('foo.txt.gz')                                                                                      
Out[5]: 
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])

Я могу явно разархивировать этот файл и получить простой текст csv:

In [6]: !gunzip foo.txt.gz | cat                                                                                         
In [7]: cat foo.txt                                                                                                      
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00 7.000000000000000000e+00
8.000000000000000000e+00 9.000000000000000000e+00 1.000000000000000000e+01 1.100000000000000000e+01

Я получаю то же самое, если сохраняю без имени gz:

np.savetxt('foo.txt',np.arange(12).reshape(3,4))
...