Python:如何使用python存储稀疏矩阵?

时间:2011-03-02 06:22:01

标签: python numpy sparse-matrix

我在python中使用稀疏矩阵输出,我需要将这个稀疏矩阵存储在我的硬盘中,我该怎么办?如果我应该创建一个数据库,那我该怎么办? 这是我的代码:

import nltk
import cPickle
import numpy
from scipy.sparse import lil_matrix
from nltk.corpus import wordnet as wn
from nltk.corpus import brown
f = open('spmatrix.pkl','wb')
def markov(L):
    count=0
    c=len(text1)
    for i in range(0,c-2):
        h=L.index(text1[i])
        k=L.index(text1[i+1])
        mat[h,k]=mat[h,k]+1//matrix
    cPickle.dump(mat,f,-1)



text = [w for g in brown.categories() for w in brown.words(categories=g)]
text1=text[1:500]
arr=set(text1)
arr=list(arr)
mat=lil_matrix((len(arr),len(arr)))
markov(arr)
f.close()

我需要将这个“mat”存储在一个文件中,并且应该使用坐标来访问矩阵的值。

稀疏矩阵的结果是这样的:`稀疏矩阵的结果是这样的:

(173, 168) 2.0 (173, 169) 1.0 (173, 172) 1.0 (173, 237) 4.0 (174, 231) 1.0 (175, 141) 1.0 (176, 195) 1.0 

但是当我将它存储到一个文件中并阅读相同的内容时我会这样:

(0, 68) 1.0 (0, 77) 1.0 (0, 95) 1.0 (0, 100)    1.0 (0, 103)    1.0 (0, 110) 1.0 (0, 112)   2.0 (0, 132)    1.0 (0, 133)    2.0 (0, 139)    1.0 (0, 146)    2.0 (0, 156)    1.0 (0, 157)    1.0 (0, 185)    1.0

7 个答案:

答案 0 :(得分:6)

假设您有问题和标签所暗示的笨拙matrixndarray,您可以使用dump方法和load功能:

your_matrix.dump('output.mat')
another_matrix = numpy.load('output.mat')

答案 1 :(得分:4)

注意:此答案是对现在提供代码的修改问题的回应。

您不应在函数中调用cPickle.dump()。创建稀疏矩阵,然后将其内容转储到文件中。

尝试:

def markov(L):
   count=0
   c=len(text1)
   for i in range(0,c-2):
       h=L.index(text1[i])
       k=L.index(text1[i+1])
       mat[h,k]=mat[h,k]+1 #matrix


text = [w for g in brown.categories() for w in brown.words(categories=g)]
text1=text[1:500]
arr=set(text1)
arr=list(arr)
mat=lil_matrix((len(arr),len(arr)))
markov(arr)
f = open('spmatrix.pkl','wb')
cPickle.dump(mat,f,-1)
f.close()

答案 2 :(得分:2)

pyTables是HDF5数据模型的Python接口,是NumPy和SciPy非常受欢迎的选择。 pyTables允许您访问数据库数组的片段,而无需将整个数组加载回内存。

我对稀疏矩阵本身没有任何具体经验,快速谷歌搜索既未证实也未否认支持稀疏矩阵。

答案 3 :(得分:2)

添加HDF5支持,Python还具有NetCDF support,非常适合矩阵形式数据存储和快速访问稀疏和密集。它包含在Python-x,y for windows中,许多python的科学用户最终都会使用它。

可以在此cookbook中找到更多基于numpy的示例。

答案 4 :(得分:2)

对于群集上非常大的稀疏矩阵,您可以使用pytrilinos,它有一个HDF5接口,可以将稀疏矩阵转储到磁盘,并且如果矩阵分布在不同的节点上也可以工作。

http://trilinos.sandia.gov/packages/pytrilinos/development/EpetraExt.html#input-output-classes

答案 5 :(得分:2)

根据稀疏矩阵的大小,我倾向于使用cPickle来挑选数组:

import cPickle
f = open('spmatrix.pkl','wb')
cPickle.dump(your_matrix,f,-1)
f.close()

如果我正在处理非常大的数据集,那么我倾向于使用netcdf4-python

修改

然后再次访问该文件:

f = open('spmatrix.pkl','rb') # open the file in read binary mode
# load the data in the .pkl file into a new variable spmat
spmat = cPickle.load(f) 
f.close()

答案 6 :(得分:2)

对我来说,使用-1函数中的cPickle.dump选项会导致pickled文件无法加载。

我通过cPickle转储的对象是scipy.sparse.dok_matrix的实例。

只使用两个参数对我来说是个窍门; documentation pickle.dump()表示protocol参数的默认值为0

使用Windows 7,Python 2.7.2(64位)和cPickle v 1.71。

示例:

>>> import cPickle
>>> print cPickle.__version__
1.71
>>> from scipy import sparse
>>> H = sparse.dok_matrix((135, 654), dtype='int32')
>>> H[33, 44] = 8
>>> H[123, 321] = -99
>>> print str(H)
  (123, 321)    -99
  (33, 44)  8
>>> fname = 'dok_matrix.pkl'
>>> f = open(fname, mode="wb")
>>> cPickle.dump(H, f)
>>> f.close()
>>> f = open(fname, mode="rb")
>>> M = cPickle.load(f)
>>> f.close()
>>> print str(M)
  (123, 321)    -99
  (33, 44)  8
>>> M == H
True
>>>