我正在尝试从巨大的(1Mx1M)CSR矩阵(SciPy)中过滤小于10的值。 由于我的所有值都是整数,除以10并重新乘以10就可以了,但我想知道是否有更好的方法来过滤元素。
修改 以下答案有效。检查您是否拥有最新版本的SciPy。
答案 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
函数进行清理。当你说'过滤'基本上你想要做的时候,不是这样:将一些值设置为零并从稀疏矩阵中删除它们?