我正在尝试将favicon.png
文件转换为.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'
答案 0 :(得分:2)
您无法将NPZ文件转换为csv文件。首先,我们需要找出NPZ文件中的文件,如下所示:
char
例如,如果上述打印输出类似于np_Array=np.load('DF_tfidf.npz')
print(np_Array.files)
因此,您需要提取该数组,然后将其转换为csv,如下所示。
['arr_0']
答案 1 :(得分:0)
这不是如何将npz转换为csv的问题,而是如何从npz正确加载数据,然后将其另存为csv的问题。通常,npz
是包含几个数组的文件存档。另一个上的csv是用于保存一个2d数组的格式。
从理论上讲,您可以将npz
的每个文件写入其自己的csv
。但是,如果npz
保存了一些复杂的对象,而不是保存一组随机的数组,那可能不是您想要的。我的猜测是您有一个scipy.sparse
矩阵(可能是在某些机器学习项目的过程中创建的)。在这种情况下,您应该专注于如何编写稀疏矩阵或它的某种表示形式,而不是转换其npz
保存。
让我们创建一个稀疏的稀疏矩阵并将其保存:
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])
我可以使用以下方法将该稀疏矩阵的稠密等价保存到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。
我想人们可以尝试用csv
格式矩阵的row,col,data属性写一个三列coo
,与我们得到的数字相同:
In [62]: print(M)
(0, 0) 0.3044221604204369
(1, 0) 0.29783571660339536
(2, 2) 0.8388193913095385