将python稀疏矩阵dict转换为scipy稀疏矩阵

将python稀疏矩阵dict转换为scipy稀疏矩阵,python,scikit-learn,sparse-matrix,Python,Scikit Learn,Sparse Matrix,我正在使用pythonscikit learn进行文档聚类,我在一个dict对象中存储了一个稀疏矩阵: 例如: doc_term_dict = { ('d1','t1'): 12, \ ('d2','t3'): 10, \ ('d3','t2'): 5 \ }

我正在使用python
scikit learn
进行文档聚类,我在一个
dict
对象中存储了一个稀疏矩阵:

例如:

doc_term_dict = { ('d1','t1'): 12,             \
                  ('d2','t3'): 10,             \
                  ('d3','t2'):  5              \
                  }                            # from mysql data table 
<type 'dict'>

我找不到将
dict
转换成这个csr矩阵的方法(我从未使用过
scipy

非常简单。首先阅读字典并将键转换为适当的行和列。Scipy支持(并为此推荐)稀疏矩阵的

传递它
数据
,和
,其中
A[row[k],column[k]=data[k]
(对于所有k)定义了矩阵。然后让Scipy进行到CSR的转换

请检查,我的行和列是否符合您的要求,我可能会将它们转置。我还假设输入是1索引的

我的代码如下:

(0, 0)        12
(1, 2)        10
(2, 1)        5
代码:

我们可以让@Unapiedra(优秀)的答案更稀疏一些:

from scipy.sparse import csr_matrix
def _dict_to_csr(term_dict):
    term_dict_v = list(term_dict.itervalues())
    term_dict_k = list(term_dict.iterkeys())
    shape = list(repeat(np.asarray(term_dict_k).max() + 1,2))
    csr = csr_matrix((term_dict_v, zip(*term_dict_k)), shape = shape)
    return csr

与@carsonc相同,但对于Python 3.X:

from scipy.sparse import csr_matrix
def _dict_to_csr(term_dict):
    term_dict_v = term_dict.values()
    term_dict_k = term_dict.keys()
    term_dict_k_zip = zip(*term_dict_k)
    term_dict_k_zip_list = list(term_dict_k_zip)

    shape = (len(term_dict_k_zip_list[0]), len(term_dict_k_zip_list[1]))
    csr = csr_matrix((list(term_dict_v), list(map(list, zip(*term_dict_k)))), shape = shape)
    return csr

谢谢@dataman编辑了我的问题
from scipy.sparse import csr_matrix
def _dict_to_csr(term_dict):
    term_dict_v = list(term_dict.itervalues())
    term_dict_k = list(term_dict.iterkeys())
    shape = list(repeat(np.asarray(term_dict_k).max() + 1,2))
    csr = csr_matrix((term_dict_v, zip(*term_dict_k)), shape = shape)
    return csr
from scipy.sparse import csr_matrix
def _dict_to_csr(term_dict):
    term_dict_v = term_dict.values()
    term_dict_k = term_dict.keys()
    term_dict_k_zip = zip(*term_dict_k)
    term_dict_k_zip_list = list(term_dict_k_zip)

    shape = (len(term_dict_k_zip_list[0]), len(term_dict_k_zip_list[1]))
    csr = csr_matrix((list(term_dict_v), list(map(list, zip(*term_dict_k)))), shape = shape)
    return csr