2011-06-03 102 views
5

我正在使用一個算法,該算法使用對角線和大對角線稀疏矩陣(將e06 x e06)的第一個非對角線塊。如何在scipy稀疏矩陣上創建視圖/ python引用?

現在我創建一個dict,以這種方式存儲塊,以便像矩陣那樣訪問塊。例如,B [0,0](5x5)給出矩陣A(20x20)的第一個塊,假設有5x5個塊,並且該矩陣A的類型爲sparse.lil

這工作正常,但需要很長時間運行。這是效率低下,因爲它複製的數據,因爲這個參考揭示了我的驚訝:GetItem Method

有沒有辦法只存儲在稀疏矩陣視圖在字典?我想更改內容並仍能夠使用相同的標識符。如果花費一點時間,它應該只做一次,這很好。塊將有許多不同的尺寸和形狀。

回答

4

據我所知,scipy.sparse中的所有稀疏矩陣都返回副本而不是某種類型的視圖。 (儘管如此,其他一些可能會比lil_matrix明顯更快)。

執行所需操作的一種方法是使用切片對象。例如:

import scipy.sparse 

class SparseBlocks(object): 
    def __init__(self, data, chunksize=5): 
     self.data = data 
     self.chunksize = chunksize 
    def _convert_slices(self, slices): 
     newslices = [] 
     for axslice in slices: 
      if isinstance(axslice, slice): 
       start, stop = axslice.start, axslice.stop 
       if axslice.start is not None: 
        start *= self.chunksize 
       if axslice.stop is not None: 
        stop *= self.chunksize 
       axslice = slice(start, stop, None) 
      elif axslice is not None: 
       axslice = slice(axslice, axslice+self.chunksize) 
      newslices.append(axslice) 
     return tuple(newslices) 

    def __getitem__(self, item): 
     item = self._convert_slices(item) 
     return self.data.__getitem__(item) 
    def __setitem__(self, item, value): 
     item = self._convert_slices(item) 
     return self.data.__setitem__(item, value) 

data = scipy.sparse.lil_matrix((20,20)) 
s = SparseBlocks(data) 
s[0,0] = 1 
print s.data 

現在,每當我們修改s[whatever]它會修改相應的塊的s.data。換句話說,s[0,0]將返回或設置s.data[:5, :5],依此類推。

+1

不錯,看起來只是我需要的東西,抱歉在延遲迴答我試圖修改代碼接受一個矩陣不同大小的多個塊。現在不要幫我,我想自己弄清楚:)。如果我遇到更多問題,我會回來。 謝謝 – Jonas 2011-06-07 15:50:29

+0

請注意,從版本0.11.0開始,SciPy有一個(塊對角線函數)[docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.block_diag.html#scipy.sparse.block_diag]在這裏有所幫助。 – drevicko 2016-02-25 11:15:52