(Python Scipy)如何将csr_matrix压平并追加到另一个csr_matrix?

4

我将每个XML文档表示为csr_matrix格式的特征矩阵。现在我有大约3000个XML文档,得到了一个csr_matrices列表。我想要将这些矩阵压缩为特征向量,然后将所有这些特征向量合并成一个csr_matrix,表示所有XML文档作为一个整体,其中每行是一个文档,每列是一个特征。

一种实现方法是通过下面的代码:

X= csr_matrix([a.toarray().ravel().tolist() for a in ls])

这里的ls是csr_matrices列表,但是这样做效率非常低,当有3000个文档时,程序会崩溃!

换句话说,我的问题是如何展开'ls'列表中的每个csr_matrix,而不必将其转换为数组,并将展开的csr_matrices附加到另一个csr_matrix中。

请注意,我正在使用带有Scipy的Python。

提前致谢!

1个回答

4

为什么您在每个 XML 中使用 csr_matrix,也许使用 lil 更好,lil_matrix 支持 reshape 方法,以下是一个示例:

N, M, K = 100, 200, 300
matrixs = [sparse.rand(N, M, format="csr") for i in xrange(K)]
matrixs2 = [m.tolil().reshape((1, N*M)) for m in matrixs]
m1 = sparse.vstack(matrixs2).tocsr()

# test with dense array
#m2 = np.vstack([m.toarray().reshape(-1) for m in matrixs])
#np.allclose(m1.toarray(), m2)

非常感谢,这是一种处理此事的强大方式。我还发现了崩溃的原因,主要瓶颈是 .tolist()。在Python中,列表速度非常慢,而与其有基础C实现的scipy矩阵相比则快得多。 - IssamLaradji

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