(Python Scipy)如何展平一个 csr_matrix 并将其附加到另一个 csr_matrix?
Posted
技术标签:
【中文标题】(Python Scipy)如何展平一个 csr_matrix 并将其附加到另一个 csr_matrix?【英文标题】:(Python Scipy) How to flatten a csr_matrix and append it to another csr_matrix? 【发布时间】:2013-03-11 21:35:27 【问题描述】:我将每个 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 中。
请注意,我将 python 与 Scipy 一起使用
提前致谢!
【问题讨论】:
【参考方案1】:为什么要为每个 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()。与具有底层 C 实现的 scipy 矩阵相比,python 中的列表非常慢以上是关于(Python Scipy)如何展平一个 csr_matrix 并将其附加到另一个 csr_matrix?的主要内容,如果未能解决你的问题,请参考以下文章
scipy.sparse.csr_matrix 行过滤 - 如何正确实现?
python使用scipy中的sparse.csr_matrix函数将numpy数组转化为稀疏矩阵(Create A Sparse Matrix)
python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)