Это не проблема того, как преобразовать 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