[英]Read sparse matrix in 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
矩阵将其数据存储在data
, indices
, indptr
,这便于计算,但有点模糊。 将其转换为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
格式将数据存储为2个列表列表,一个包含数据(本例中为全1),另一个包含行索引。
或者你是以其他方式“读取”数据的?
这是一个SciPy CSR矩阵 。 要将其转换为(row,col,value)三元组,最简单的选择是转换为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)]
(请注意,输出已排序。)
您可以使用data
和indices
:
>>> 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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.