使用PyTables,哪个更高效:scipy.sparse还是numpy密集矩阵?

9
使用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 会处理压缩?

2
所以问题是,“这会使CSR矩阵负载过重吗?”我无法回答,因为我不了解PyTables。但我知道你可以构建一个由mmap'd数组支持的CSR矩阵... - Fred Foo
2
你是否找到了解决这个问题的好方法?我遇到了同样的问题,几乎已经放弃了,只能将其转换为密集格式以便正常使用pytables。 - Jesse Sherlock
3
@JesseSherlock 很遗憾,实际上不是这样的。最终我们决定放弃使用pytables,因为它不适用于稀疏矩阵,而能够使用scipy库对我们来说更加重要。我们现在采用的解决方案是,将矩阵的每一行以稀疏格式(列索引和数据)独立地序列化到磁盘上(实际上是mongodb)。这样,如果矩阵的一行发生变化,只需要刷新那一行即可。但这种方法在列发生变化时有些不灵活,需要完全刷新整个矩阵(或者编写一些麻烦的代码...),但在我们的应用中这种情况很少发生。 - tdc
1
你正在处理一个无法适应内存的单个稀疏矩阵?这相当强硬。事实上,你甚至考虑以任何方式将同一矩阵视为密集矩阵,这意味着我们两个中有一个人在这里缺少了某些东西。 - Eelco Hoogendoorn
1
我刚想到另一种可能性,应该能够满足你的所有需求,如果我理解得正确的话;你应该能够在pytables中以坐标格式(i,j,data)存储矩阵。然后,如果你索引i和j列,使用table.where()更新行和列应该非常高效,无论你的矩阵有多大。 - Eelco Hoogendoorn
显示剩余3条评论
1个回答

2

1
这种方法的问题在于,您必须对整个内容进行反序列化才能在其上使用scipy矩阵操作,或编写自己的等效操作以处理pytables中的数据项。 - tdc
1
还可以看看你链接的问题上我的答案...你也需要存储shape属性。 - Pietro Battiston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接