29

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,:]

我在这里有点猜测,因此我的代码很慢。任何了解其工作原理的人的帮助将不胜感激。提前致谢。

如果事实证明我不应该用一个布尔数组来索引我的矩阵,而是一个整数列表(索引)——这也是我很乐意发现的。哪个更有效率。

最后 - 这是一个很大的矩阵,所以如果这可以发生在适当的位置/通过广播,那么可以加分。

4

1 回答 1

49

好的,所以我很确定这样做的“正确”方法是:如果要对列进行切片,请使用 tocsc() 并使用整数列表/数组进行切片。布尔向量似乎对稀疏矩阵不起作用——就像它在 numpy 中对 ndarray 所做的那样。这意味着答案是。

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

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

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

于 2012-11-12T22:22:14.660 回答