據我所知,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]
,依此類推。
不錯,看起來只是我需要的東西,抱歉在延遲迴答我試圖修改代碼接受一個矩陣不同大小的多個塊。現在不要幫我,我想自己弄清楚:)。如果我遇到更多問題,我會回來。 謝謝 – Jonas 2011-06-07 15:50:29
請注意,從版本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