【问题标题】:Using pytables, which is more efficient: scipy.sparse or numpy dense matrix?使用 pytables,哪个更有效:scipy.sparse 还是 numpy 密集矩阵?
【发布时间】:2012-02-12 06:52:00
【问题描述】:

使用pytables 时,不支持(据我所知)scipy.sparse 矩阵格式,因此要存储矩阵,我必须进行一些转换,例如

def store_sparse_matrix(self):
    grp1 = self.getFileHandle().createGroup(self.getGroup(), 'M')
    self.getFileHandle().createArray(grp1, 'data', M.tocsr().data)
    self.getFileHandle().createArray(grp1, 'indptr', M.tocsr().indptr)
    self.getFileHandle().createArray(grp1, 'indices', M.tocsr().indices)

def get_sparse_matrix(self):
    return sparse.csr_matrix((self.getGroup().M.data, self.getGroup().M.indices, self.getGroup().M.indptr))

问题在于get_sparse 函数需要一些时间(从磁盘读取),如果我理解正确,还需要将数据放入内存中。

唯一的其他选项似乎是将矩阵转换为密集格式(numpy array),然后正常使用pytables。然而这似乎效率很低,尽管我想pytables 可能会处理压缩本身?

【问题讨论】:

  • @larsmans 但是当将 NumPy 数组与 pytables 结合使用时,我的理解是它仅在必要时从磁盘加载,因此整个矩阵不必放入内存中。但是,它确实需要将包括零在内的整个矩阵存储在磁盘上(因此在必要时也可以读取/写入磁盘)。看起来这会产生不必要的开销,而实际上可能只需要读取几个值。但是,如果没有对 scipy.sparse 的本机支持,我看不出如何避免这种情况?
  • 所以问题是,“这个需求会加载 CSR 矩阵吗?”我无法回答这个问题,因为我不知道 PyTables。我知道您可以构建一个由 mmap 数组支持的 CSR 矩阵...
  • 你有没有找到一个好的解决方案?我遇到了同样的问题,几乎只能转换为密集格式才能正常使用 pytables。
  • @JesseSherlock 不幸的是,并非如此。最后我们决定放弃 pytables,因为它根本不适合稀疏矩阵,而能够使用 scipy 对我们来说更重要。我们的解决方案是以稀疏格式(列索引和数据)独立地将矩阵的行序列化到磁盘(实际上是 mongodb)。这样,如果矩阵的一行发生更改,则该行就是需要刷新的所有内容。然而,这对于列中的更改有些不灵活,需要完全刷新(或一些令人头疼的代码......),但这在我们的应用程序中很少发生。
  • 您正在处理一个不适合 ram 的稀疏矩阵?可以说是比较硬核了。事实上,您甚至考虑以任何方式将同一个矩阵视为稠密矩阵,这意味着我们两个人中的一个在这里遗漏了一些东西。

标签: python numpy scipy sparse-matrix pytables


【解决方案1】:

借用Storing numpy sparse matrix in HDF5 (PyTables),您可以使用其dataindiciesindptr 属性(三个常规numpy.ndarray 对象)将scipy.sparse 数组编组为pytables 格式。

【讨论】:

  • 这种方法的问题在于,您必须反序列化整个事物才能对其使用 scipy 矩阵运算,或者编写您自己的等价物来处理 pytables 中的数据项。
  • 另见my answer关于你链接的问题......你也必须存储shape属性。
猜你喜欢
  • 2012-05-28
  • 2011-10-14
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2019-11-14
相关资源
最近更新 更多