Получение ключевой ошибки при преобразовании npz в формат csv - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь преобразовать файл .npz в формат .csv, но он дает следующую ошибку ключа KeyError: '0 is not a file in the archive'

У меня была разреженная матрица, которую я преобразовал в формат .npz.Затем я загрузил файл npz, используя np.load().Я попытался преобразовать загруженный файл npz в csv, используя np.savetxt(), но он выдает следующую ошибку KeyError: '0 is not a file in the archive'.

Что означает эта ключевая ошибка и как ее решить?

Я попыталсяследующий код:

DF = np.load("DF_tfidf.npz")

np.savetxt("DF.csv",DF)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Это не проблема того, как преобразовать npz в csv, а как правильно загрузить данные из npz, а затем сохранить их как csv.В общем случае npz - это файловый архив, который содержит несколько массивов.CSV с другой стороны - это формат для сохранения одного 2d массива.

Теоретически вы можете записать каждый файл npz в свой csv.Но если npz сохраняет некоторый сложный объект, а не случайный набор массивов, это, вероятно, не то, что вы хотите сделать.Я предполагаю, что у вас есть матрица scipy.sparse (возможно, созданная в ходе какого-либо проекта машинного обучения).В этом случае вам следует сосредоточиться на том, как написать разреженную матрицу или ее представление, а не на преобразовании ее npz save.

Давайте создадим скудную разреженную матрицу и сохраним ее:

In [45]: from scipy import sparse
In [46]: M = sparse.random(4,4,.2,'csr')
In [47]: M
Out[47]: 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>
In [48]: M.A
Out[48]: 
array([[0.30442216, 0.        , 0.        , 0.        ],
       [0.29783572, 0.        , 0.        , 0.        ],
       [0.        , 0.        , 0.83881939, 0.        ],
       [0.        , 0.        , 0.        , 0.        ]])
In [49]: sparse.save_npz('sparse.npz',M)

Теперь загрузите его:

In [50]: sparse.load_npz('sparse.npz')
Out[50]: 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>

Это то же самое, что мы сохранили.

Теперь посмотрите на это с np.load:

In [51]: data = np.load('sparse.npz')
In [52]: list(data.keys())
Out[52]: ['indices', 'indptr', 'format', 'shape', 'data']
In [53]: data['indices']
Out[53]: array([0, 0, 2], dtype=int32)
In [54]: data['indptr']
Out[54]: array([0, 1, 2, 3, 3], dtype=int32)
In [55]: data['format']
Out[55]: array(b'csr', dtype='|S3')
In [56]: data['shape']
Out[56]: array([4, 4])
In [57]: data['data']
Out[57]: array([0.30442216, 0.29783572, 0.83881939])

Iможно сохранить плотный эквивалент этой разреженной матрицы в csv с помощью:

In [60]: np.savetxt('sparse.csv', M.A, fmt='%10f',delimiter=',')
In [61]: cat sparse.csv
  0.304422,  0.000000,  0.000000,  0.000000
  0.297836,  0.000000,  0.000000,  0.000000
  0.000000,  0.000000,  0.838819,  0.000000
  0.000000,  0.000000,  0.000000,  0.000000

Для такой небольшой матрицы это не проблема.Но часто в машинном обучении разреженная матрица очень велика, и M.A вызывает ошибку MemoryError.

Полагаю, можно попытаться записать 3 столбца csv со строкой, столбцом, атрибутами данных coo матрица формата, те же самые числа, которые мы получаем с:

In [62]: print(M)
  (0, 0)    0.3044221604204369
  (1, 0)    0.29783571660339536
  (2, 2)    0.8388193913095385
0 голосов
/ 02 января 2019

Вы не можете конвертировать файл NPZ в файл CSV. Для начала нам нужно выяснить, что это за файлы в файле NPZ, как показано ниже

np_Array=np.load('DF_tfidf.npz')
print(np_Array.files)

например, если вывод похож на ['arr_0'] для печати выше Поэтому вам нужно извлечь этот массив и затем преобразовать его в CSV, как показано ниже.

arr=np_Array.files[0]
np.savetxt("DF.csv", np_Array[arr], delimiter=",")
...