从numpy python中的稀疏矩阵生成密集矩阵

41 python arrays numpy scipy sparse-matrix

我有一个Sqlite数据库,其中包含以下类型的架构:

termcount(doc_num, term , count)
Run Code Online (Sandbox Code Playgroud)

此表包含文档中各自计数的术语.喜欢

(doc1 , term1 ,12)
(doc1, term 22, 2)
.
.
(docn,term1 , 10)
Run Code Online (Sandbox Code Playgroud)

该矩阵可以被认为是稀疏矩阵,因为每个文档包含非常少的将具有非零值的项.

如何使用numpy从这个稀疏矩阵创建一个密集矩阵,因为我必须使用余弦相似度计算文档之间的相似性.

这个密集矩阵看起来像一个表格,其中docid作为第一列,所有条款都将列为第一行.剩余的单元格将包含计数.

Rac*_*len 78

 from scipy.sparse import csr_matrix
 A = csr_matrix([[1,0,2],[0,3,0]])
 >>>A
 <2x3 sparse matrix of type '<type 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>
 >>> A.todense()
   matrix([[1, 0, 2],
           [0, 3, 0]])
 >>> A.toarray()
      array([[1, 0, 2],
            [0, 3, 0]])
Run Code Online (Sandbox Code Playgroud)

这是一个如何将稀疏矩阵转换为从scipy取得的密集矩阵的示例


小智 8

我用Pandas解决了这个问题.因为我们想保留文档ID和term id.

from pandas import DataFrame 

# A sparse matrix in dictionary form (can be a SQLite database). Tuples contains doc_id        and term_id. 
doc_term_dict={('d1','t1'):12, ('d2','t3'):10, ('d3','t2'):5}

#extract all unique documents and terms ids and intialize a empty dataframe.
rows = set([d for (d,t) in doc_term_dict.keys()])  
cols = set([t for (d,t) in doc_term_dict.keys()])
df = DataFrame(index = rows, columns = cols )
df = df.fillna(0)

#assign all nonzero values in dataframe
for key, value in doc_term_dict.items():
    df[key[1]][key[0]] = value   

print df
Run Code Online (Sandbox Code Playgroud)

输出:

    t2  t3  t1
d2  0  10   0
d3  5   0   0
d1  0   0  12
Run Code Online (Sandbox Code Playgroud)