【问题标题】:Getting a key error while converting npz to csv format将 npz 转换为 csv 格式时出现关键错误
【发布时间】:2019-05-28 19:00:38
【问题描述】:

我正在尝试将.npz 文件转换为.csv 格式,但它给出了以下关键错误 KeyError: '0 is not a file in the archive'

我有一个稀疏矩阵,我将其转换为.npz 格式。然后我使用np.load() 加载了 npz 文件。我尝试使用np.savetxt() 将加载的 npz 文件转换为 csv,但它给出了以下错误 KeyError: '0 is not a file in the archive'.

这个关键错误是什么意思以及如何解决?

我尝试了以下代码:

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

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

【问题讨论】:

  • np.load 给你一个像对象一样的字典。实际的数组通过名称或字典key 访问。因此,简单地将这个对象传递给savetxt 函数是没有意义的。我怀疑你是在尝试使用这些函数而不了解它们产生和需要什么。
  • 如果你创建了一个scipy 稀疏矩阵,并用save_npz 保存它,你又增加了一层复杂性。虽然可以使用np.load 读取这样的文件,但您必须先了解保存格式。相反,如果您使用load_npz,您会得到一个稀疏矩阵,就像您开始时一样。将其保存为 csv 文本格式是不同的主题。最简单的方法是将其转换为密集数组,使用toarray(),并使用savetxt 写入。但是,如果稀疏矩阵很大,您最终可能会得到 MemoryError
  • 您希望csv 究竟是什么样子?
  • 问题与machine-learning 无关 - 请不要向标签发送垃圾邮件(已删除)。

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


【解决方案1】:

这不是如何将npz转换为csv的问题,而是如何从npz正确加载数据,然后将其保存为csv。通常,npz 是一个包含多个数组的文件存档。另一种 csv 是一种用于保存一个二维数组的格式。

理论上,您可以将npz 的每个文件写入其自己的csv。但是如果npz 保存了一些复杂的对象,而不是一组随机的数组,那可能不是您想要做的。我的猜测是你有一个scipy.sparse 矩阵(可能是在一些机器学习项目的过程中创建的)。在这种情况下,您应该专注于如何编写稀疏矩阵或它的某种表示,而不是转换其npz 保存。

让我们制作一个 scipy 稀疏矩阵并保存它:

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。

我想可以尝试用coo 格式矩阵的行、列、数据属性编写一个 3 列的csv,与我们得到的数字相同:

In [62]: print(M)
  (0, 0)    0.3044221604204369
  (1, 0)    0.29783571660339536
  (2, 2)    0.8388193913095385

【讨论】:

    【解决方案2】:

    您无法将 NPZ 文件转换为 csv 文件。首先,我们需要找出 NPZ File 中的文件,如下所示

    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=",")
    

    【讨论】:

    • 这会忽略数组的形状和数据类型。 OP 对 npz 的内容的理解不足以获得有意义的 csvs
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 2021-10-03
    • 2022-11-07
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多