2011-03-02 88 views
8

我有一个输出在python中使用稀疏矩阵,我需要将这个稀疏矩阵存储在我的硬盘中,我该怎么做呢?如果我应该创建一个数据库,那么我应该怎么做? 这是我的代码:Python:如何使用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() 

我需要存储这个“垫”的文件,并应访问使用坐标矩阵的值..稀疏矩阵的

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

(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 
+3

你心里有一个特定的数据库?这些矩阵的大小是多少?你有没有考虑过sqlite(Python有内置的支持)? – NullUserException 2011-03-02 06:26:07

+0

我是一个新手,我不太了解,嗯,我只是想找到一个解决方案,将我的矩阵存储在硬盘上,我不想运行程序来一次又一次地生成矩阵,如果我可以存储矩阵我可以在下一次参考值的矩阵..请建议我..谢谢:) – 2011-03-02 09:06:56

+1

请参阅以下格式化您的代码,以便它是可读的:http://stackoverflow.com/editing-help,但基本上只需在每行代码前放4个空格,然后缩进,否则确保在代码和任何普通文本之间留下空行。 – JoshAdel 2011-03-02 19:52:37

回答

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() 
+1

这段代码运行没有错误infact它将矩阵输出到文件留下的一部分虽然!..我无法使用此命令.. .. 'mat.dump('output.mat')''mat'是我的矩阵..这是我找到'raise AttributeError,attr +'找不到的错误“ AttributeError:转储未找到' – 2011-03-02 20:28:15

+3

您似乎现在正在使用其他方法,因为mat.dump()没有出现在您的代码或我的建议中。我很抱歉,但我没有时间进一步帮助你。祝你好运。 – JoshAdel 2011-03-02 20:33:42

2

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

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

6

假设你有一个numpy的matrixndarray,你的问题和标签意味着,有一个dump方法和load功能,您可以使用:

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

所以我可以随时使用这个output.mat我需要在其他程序? – 2011-03-02 08:58:04

+0

是的。这只是硬盘驱动器上任何想要存储数据的文件的路径。 – ide 2011-03-02 09:50:19

2

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

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

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() 
+0

非常感谢:)如果你能解释如何访问spmatrix.pkl会有很大的帮助..再次感谢:) – 2011-03-02 15:40:14

+0

非常感谢你的帮助:) – 2011-03-02 18:22:24

+0

这是文件的实际输入( 0,148)\t 1.0 (1,48)\t 1.0 (1,173)\t 1.0 (2,173)\t 1.0 (3,168)\t 1.0 (4,61)\t 1.0 (4, 91)\t 1.0 (5,136)\t 1.0 (6,237)\t 2.0 (7,111)\t 1.0 b UT读取从.pkl文件我得到\t 1.0 (0,48)\t 1.0 (0,173)\t 1.0 (0,173)的数据(0,148)后\t 1.0 (0,168) \t 1.0 (0,61)\t 1.0 (0,91)\t 1.0 (0,136)\t 1.0 (0,237)\t 2.0 (0,111)\t 1.0 什么错误我已经做因为你已经指示:( – 2011-03-02 19:24:48

2

对于我来说,使用cPickle.dump功能-1选项导致腌文件不加载之后。

我倾销cPickle的对象是scipy.sparse.dok_matrix的实例。

只使用了两个参数对我来说诀窍; documentationpickle.dump()指出参数的默认值为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 
>>>