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)
据我可以从教程中收集 - 切片列我想要使用CSC并切片行我想切片CSR。那么这是否意味着我应该通过以下方式投射矩阵M
:
M.tocsc()[:,bool_vect]
或
M.tocsr()[bool_vect,:]
我在这里猜测,因为它,我的代码很慢。知道如何工作的人的任何帮助将不胜感激。提前谢谢。
如果事实证明我不应该使用布尔数组索引我的矩阵,而是使用整数列表(索引) - 这也是我很乐意找到的东西。哪个更有效率。
最后 - 这是一个很大的矩阵,如果这可以在广播中发生,那么奖励分数。
答案 0 :(得分:44)
好的,所以我很确定这样做的“正确”方法是: 如果要切片列,请使用tocsc()和切片使用整数列表/数组。布尔向量似乎没有使用稀疏矩阵 - 它在numpy中使用ndarrays的方式。这意味着答案是。
indices = np.where(bool_vect)[0]
out1 = M.tocsc()[:,indices]
out2 = M.tocsr()[indices,:]
但问题是:这是最好的方法吗?这到位了吗?
在实践中,这似乎确实发生了 - 它比以前的尝试(使用lil_matrix)快得多。