2016-03-10 254 views
0

我有一個稀疏矩陣以座標格式存儲在磁盤上(三元組格式)。 我想讀取矩陣塊到內存中,使用scipy.sparse,但是,當這樣做時,無論塊如何,scipy總是會假設從0,0開始的密集矩陣索引。這意味着,例如,對於稀疏矩陣中的最後一個「塊」,scipy將被解釋爲僅在右下角具有一些值的巨大矩陣。稀疏矩陣子集密集矩陣

如何正確處理塊以便在執行toarray創建密集矩陣時只創建與該塊對應的子集?

這樣做的原因是,即使稀疏,矩陣對於內存(大約6億32位浮點值)來說太大,並且在屏幕上顯示(因爲矩陣表示地理空間柵格),我需要將其轉換到一個密集的矩陣來存儲一個地理空間格式(例如geotiff)。

回答

0

在構建子集時,您應該能夠調整rowcol的值。例如:

In [84]: row=np.arange(10)  
In [85]: col=np.random.randint(0,6,row.shape) 
In [86]: data=np.ones(row.shape,dtype=int)*2 

In [87]: M=sparse.coo_matrix((data,(row,col)),shape=(10,6)) 

In [88]: M.A 
Out[88]: 
array([[0, 0, 2, 0, 0, 0], 
     [0, 0, 0, 0, 0, 2], 
     [0, 0, 0, 2, 0, 0], 
     [0, 0, 2, 0, 0, 0], 
     [0, 0, 2, 0, 0, 0], 
     [0, 2, 0, 0, 0, 0], 
     [2, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 2, 0], 
     [0, 0, 0, 2, 0, 0], 
     [0, 0, 0, 0, 0, 2]]) 

要建立一個矩陣與行的子集使用:

In [89]: M1=sparse.coo_matrix((data[5:],(row[5:]-5,col[5:])),shape=(5,6)) 

In [90]: M1.A 
Out[90]: 
array([[0, 2, 0, 0, 0, 0], 
     [2, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 2, 0], 
     [0, 0, 0, 2, 0, 0], 
     [0, 0, 0, 0, 0, 2]]) 

你必須決定是否要指定形狀M1,還是讓它推斷它範圍從rowcol

如果這些座標沒有排序,或者您還想要取一個子範圍col,事情可能會變得更加複雜。但我認爲這抓住了基本的想法。

+0

謝謝,這是一個很好的開始。理想情況下,我想採取我正在努力的「col」子範圍。座標可以按行排序,然後按col排序 – jramm