在Scipy中切片稀疏矩阵 - 哪种类型最好?

时间:2012-11-12 21:58:57

标签: python indexing scipy sparse-matrix slice

SciPy Sparse Matrix tutorial非常好 - 但它实际上留下了切片un(der)开发的部分(仍然是大纲形式 - 参见章节:“处理稀疏矩阵”)。

一旦这个问题得到解答,我会尝试更新教程。

我有一个大的稀疏矩阵 - 目前采用dok_matrix格式。

import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))

对于各种方法,我希望能够对列进行切片,而对于其他我希望切片行的方法。理想情况下,我会使用高级索引(即布尔向量bool_vect)来对稀疏矩阵M进行切片 - 如下所示:

bool_vect = np.arange(10**6)%2  # every even index
out = M[bool_vect,:]            # Want to select every even row

out = M[:,bool_vect] # Want to select every even column

首先,dok_matrices不支持这一点 - 但我认为如果我通过sparse.lil_matrix(M)

首次投射到lil_matrices,它会缓慢起作用

据我可以从教程中收集 - 切片列我想要使用CSC并切片行我想切片CSR。那么这是否意味着我应该通过以下方式投射矩阵M

M.tocsc()[:,bool_vect]

M.tocsr()[bool_vect,:]

我在这里猜测,因为它,我的代码很慢。知道如何工作的人的任何帮助将不胜感激。提前谢谢。

如果事实证明我不应该使用布尔数组索引我的矩阵,而是使用整数列表(索引) - 这也是我很乐意找到的东西。哪个更有效率。

最后 - 这是一个很大的矩阵,如果这可以在广播中发生,那么奖励分数。

1 个答案:

答案 0 :(得分:44)

好的,所以我很确定这样做的“正确”方法是: 如果要切片列,请使用tocsc()和切片使用整数列表/数组。布尔向量似乎没有使用稀疏矩阵 - 它在numpy中使用ndarrays的方式。这意味着答案是。

indices = np.where(bool_vect)[0]
out1 = M.tocsc()[:,indices]
out2 = M.tocsr()[indices,:]

但问题是:这是最好的方法吗?这到位了吗?

在实践中,这似乎确实发生了 - 它比以前的尝试(使用lil_matrix)快得多。