2011-03-02 34 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 
>>>