【问题标题】:Converting python sparse matrix dict to scipy sparse matrix将python稀疏矩阵dict转换为scipy稀疏矩阵
【发布时间】:2023-04-10 12:23:02
【问题描述】:

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

例如:

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

我想用scikit-learn做输入矩阵类型为scipy.sparse.csr.csr_matrix的聚类

例子:

(0, 2164)   0.245793088885
(0, 2076)   0.205702177467
(0, 2037)   0.193810934784
(0, 2005)   0.14547028437
(0, 1953)   0.153720023365
...
<class 'scipy.sparse.csr.csr_matrix'>

我找不到将dict 转换为这个csr-matrix 的方法(我从未使用过scipy。)

【问题讨论】:

  • 感谢@dataman 编辑了我的问题

标签: python scikit-learn sparse-matrix


【解决方案1】:

与@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

【讨论】:

    【解决方案2】:

    我们可以让@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
    

    【讨论】:

      【解决方案3】:

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

      传递它data、row 和column,其中A[row[k], column[k] = data[k](对于所有k)定义矩阵。然后让 Scipy 转换为 CSR。

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

      我的代码打印如下:

      (0, 0)        12
      (1, 2)        10
      (2, 1)        5
      

      代码:

      #!/usr/bin/env python3
      #http://stackoverflow.com/questions/26335059/converting-python-sparse-matrix-dict-to-scipy-sparse-matrix
      
      from scipy.sparse import csr_matrix, coo_matrix
      
      def convert(term_dict):
          ''' Convert a dictionary with elements of form ('d1', 't1'): 12 to a CSR type matrix.
          The element ('d1', 't1'): 12 becomes entry (0, 0) = 12.
          * Conversion from 1-indexed to 0-indexed.
          * d is row
          * t is column.
          '''
          # Create the appropriate format for the COO format.
          data = []
          row = []
          col = []
          for k, v in term_dict.items():
              r = int(k[0][1:])
              c = int(k[1][1:])
              data.append(v)
              row.append(r-1)
              col.append(c-1)
          # Create the COO-matrix
          coo = coo_matrix((data,(row,col)))
          # Let Scipy convert COO to CSR format and return
          return csr_matrix(coo)
      
      if __name__=='__main__':
          doc_term_dict = { ('d1','t1'): 12,             \
                      ('d2','t3'): 10,             \
                      ('d3','t2'):  5              \
                      }   
          print(convert(doc_term_dict))
      

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 2021-11-25
        • 2017-07-02
        • 1970-01-01
        • 2015-05-08
        • 2018-01-19
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多