2014-02-27 150 views
6

我试图从巨大(1Mx1M)CSR矩阵(SciPy)中筛选小于10的值。 由于我所有的值都是整数,所以除以10和重新乘以10就可以完成这项工作,但我想知道是否没有更好的方法可以实现过滤元素。从scipy稀疏矩阵中筛选值

编辑: 下面的答案工作。检查您是否拥有SciPy的最新版本。

+0

这是如何工作的? 11/10 * 10 = 10,而不是11。 – wflynny

+0

那么,对于我的具体应用来说,它已经足够好了,但正如我所说的那样,应该有更好的(即更快更准确)的方法。 – Omer

回答

5

你也可以去的少哈克,但可能较慢:

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]) 
+0

我不确定直接调用压缩表示法“hacky”是否公平 - 表示法[记录](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix毕竟,.html)。 –

+0

请不要误解我的意思,我认为你的答案完全有效。你目前的单独upvote是我的。 ;)我有关于稀疏矩阵的答案,这些稀疏矩阵在所有三个内部阵列中都会遇到可怕的复杂问题。这种冒险的操作是合理的,因为scipy.sparse非常有用,每个发行版都有巨大的功能飞跃。但是,尽管我们还没有到达目标,但最终的目标应该是可以做到m [m <10] = 0,就像人们对待任何数组一样,并且用它来完成。我想,我的答案有点接近那个理想。 – Jaime

+0

谢谢Jaime!是否将(m> = 10)解释为一个新的特征?它似乎不适用于我的SciPy版本。 – Omer

1

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

一些东西,可能在早期版本的工作是:

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

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

+0

确认,这可以和scipy 0.11.0一起使用 – Peter