从scipy稀疏矩阵中过滤值

时间:2014-02-27 16:15:56

标签: python scipy sparse-matrix

我正在尝试从巨大的(1Mx1M)CSR矩阵(SciPy)中过滤小于10的值。 由于我的所有值都是整数,除以10并重新乘以10就可以了,但我想知道是否有更好的方法来过滤元素。

修改 以下答案有效。检查您是否拥有最新版本的SciPy。

2 个答案:

答案 0 :(得分:8)

你也可以选择较少的hacky,但可能更慢:

m = m.multiply(m >= 10)

了解发生了什么:

>>> m = scipy.sparse.csr_matrix((1000, 1000), dtype=np.int)
>>> m[np.random.randint(0, 1000, 20),
      np.random.randint(0, 1000, 20)] = np.random.randint(0, 100, 20)
>>> m.data
array([92, 46, 99, 24, 75, 16, 49, 60, 87, 64, 91, 37, 30, 32, 25, 40, 99,
        9,  3, 84])
>>> m >= 10
<1000x1000 sparse matrix of type '<type 'numpy.bool_'>'
    with 18 stored elements in Compressed Sparse Row format>
>>> m = m.multiply(m >= 10)
>>> m
<1000x1000 sparse matrix of type '<type 'numpy.int32'>'
    with 18 stored elements in Compressed Sparse Row format>
>>> m.data
array([92, 46, 99, 24, 75, 16, 49, 60, 87, 64, 91, 37, 30, 32, 25, 40, 99,
       84])

答案 1 :(得分:1)

我认为版本问题与比较运算符的实现有关。 m >= 0使用m.__gt__。 (我没有scipy的早期版本来测试这个,但我相信在这个主题上有一个或多个SO线程。)

在早期版本中可能有用的东西是:

m.data *= m.data>=10
m.eliminate_zeros()

换句话说,使用标准numpy操作将选定值设置为0.测试可能会复杂得多。然后使用标准sparse函数进行清理。当你说'过滤'基本上你想要做的时候,不是这样:将一些值设置为零并从稀疏矩阵中删除它们?