SciPy稀疏矩阵教程非常好——但它实际上留下了未开发的切片部分(仍处于大纲形式——请参阅“处理稀疏矩阵”部分)。
一旦回答了这个问题,我将尝试更新教程。
我有一个大的稀疏矩阵——目前是 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 不支持这一点 - 但我认为如果我首先转换为 lil_matrices,它会(缓慢)通过sparse.lil_matrix(M)
据我从教程中收集到的信息 - 对我想使用 CSC 的列进行切片,对我想对 CSR 进行切片的行进行切片。这是否意味着我应该M
通过以下方式转换矩阵:
M.tocsc()[:,bool_vect]
或者
M.tocsr()[bool_vect,:]
我在这里有点猜测,因此我的代码很慢。任何了解其工作原理的人的帮助将不胜感激。提前致谢。
如果事实证明我不应该用一个布尔数组来索引我的矩阵,而是一个整数列表(索引)——这也是我很乐意发现的。哪个更有效率。
最后 - 这是一个很大的矩阵,所以如果这可以发生在适当的位置/通过广播,那么可以加分。