【发布时间】: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