2013-06-01 120 views
0

我从sklearn袋式矢量化器中有一个稀疏矩阵。它是一个csr_matrix,其元素表示文档中的词频。但现在我需要的是0/1矩阵,其中1代表文档中存在的单词,所以我不关心实际的频率。 忽略的背景问题,是这样的: 我有一个稀疏矩阵,如何将一个整数值稀疏矩阵转换为0/1值稀疏矩阵,Python

2 3 4 0 0 0 
0 0 0 0 0 8 
0 0 0 2 0 0 
0 0 0 0 0 0 

我希望所有的非零元素为1,

1 1 1 0 0 0 
0 0 0 0 0 1 
0 0 0 1 0 0 
0 0 0 0 0 0 

我怎样才能做到这一点?我假设使用todense(),然后循环不是一个好的选择,因为稀疏矩阵很大。有没有更好的办法?

回答

1

尝试csr_matrix.sign。它应该正是你所需要的(尽管我自己没有尝试过)。

+0

谢谢!它的工作 –

1

我想你可以从非零指数创建一个新矩阵(参见scipy.sparse.csr_matrix参考)。假设你的稀疏矩阵被命名为sp_m:

sp_unit = csr_matrix(([1]*len(sp_m.data), sp_m.nonzero()), shape=sp_m.shape) 

OR

至于另一网友指出,你可以使用符号函数;不过,我认为如果您有负值,您将需要将其平方:

sp_unit = sp_m.sign.multiply(sp_m.sign) 
+0

谢谢你的详细解答! .sign()似乎解决了我的问题 –

+0

请注意,如果在稀疏矩阵中有负值​​,那么在使用.sign()后,这些值将被转换为-1。如果您在一般情况下确实只需要0和1,请将.sign与.multiply一起使用,如上所述。 – bcorso