在python中读取稀疏矩阵



我想读取稀疏矩阵。当我使用scikit构建ngrams时,学习。它的transform()以稀疏矩阵形式输出。我想在不执行todense()的情况下读取该矩阵。

代码:

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
document = ['john guy','nice guy']
vectorizer = CountVectorizer(ngram_range=(1, 2))
X = vectorizer.fit_transform(document)
transformer = vectorizer.transform(document)
print transformer

输出:

  (0, 0)    1
  (0, 1)    1
  (0, 2)    1
  (1, 0)    1
  (1, 3)    1
  (1, 4)    1

如何读取此输出以获取其。我需要(0,0)、(0,1)等处的值,并保存到列表中。

这个transform方法的文档说它返回一个稀疏矩阵,但没有指定类型。不同的类型允许您以不同的方式访问数据,但很容易将一种数据转换为另一种数据。您的打印显示是稀疏矩阵的典型str

等效矩阵可以用生成

from scipy import sparse
i=[0,0,0,1,1,1]
j=[0,1,2,0,3,4]
A=sparse.csr_matrix((np.ones_like(j),(i,j)))
print(A)

生产:

  (0, 0)        1
  (0, 1)        1
  (0, 2)        1
  (1, 0)        1
  (1, 3)        1
  (1, 4)        1

csr类型可以像密集矩阵一样进行索引:

In [32]: A[0,0]
Out[32]: 1    
In [33]: A[0,3]
Out[33]: 0

在内部,csr矩阵将其数据存储在dataindicesindptr中,这便于计算,但有点模糊。将其转换为coo格式以获得与您的输入类似的数据:

In [34]: A.tocoo().row
Out[34]: array([0, 0, 0, 1, 1, 1], dtype=int32)
In [35]: A.tocoo().col
Out[35]: array([0, 1, 2, 0, 3, 4], dtype=int32)

或者,您可以将其转换为dok类型,并像字典一样访问该数据:

A.todok().keys()
#  dict_keys([(0, 1), (0, 0), (1, 3), (1, 0), (0, 2), (1, 4)])
A.todok().items()

生成:(此处为Python3)

dict_items([((0, 1), 1), 
            ((0, 0), 1), 
            ((1, 3), 1), 
            ((1, 0), 1), 
            ((0, 2), 1), 
            ((1, 4), 1)])

lil格式将数据存储为两个列表,一个具有数据(在本例中均为1),另一个具有行索引。

或者你用其他方式"读取"数据?

这是一个SciPy CSR矩阵。要将其转换为(行、列、值)三元组,最简单的选择是转换为COO格式,然后从中获得三元组:

>>> from scipy.sparse import rand
>>> X = rand(100, 100, format='csr')
>>> X
<100x100 sparse matrix of type '<type 'numpy.float64'>'
    with 100 stored elements in Compressed Sparse Row format>
>>> zip(X.row, X.col, X.data)[:10]
[(1, 78, 0.73843533223380842),
 (1, 91, 0.30943772717074158),
 (2, 35, 0.52635078317400608),
 (4, 75, 0.34667509458006551),
 (5, 30, 0.86482318943934389),
 (7, 74, 0.46260571098933323),
 (8, 75, 0.74193890941716234),
 (9, 72, 0.50095749482583696),
 (9, 80, 0.85906284644174613),
 (11, 66, 0.83072142899400137)]

(注意,输出是排序的。)

您可以将dataindices用作:

>>> indices=transformer.toarray()
>>> indices
array([[1, 1, 1, 0, 0],
      [1, 0, 0, 1, 1]])
>>> values=transformer.data
>>> values
array([1, 1, 1, 1, 1, 1])

相关内容

  • 没有找到相关文章

最新更新