将npz转换为CSV格式时遇到密钥错误

时间:2019-01-02 04:11:15

标签: python-3.x csv numpy scipy sparse-matrix

我正在尝试将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'

2 个答案:

答案 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