我正在开发一种算法,该算法使用一个大的(将是e06 x e06)块对角线稀疏矩阵的对角线和第一个非对角线块。
现在我创建一个dict,以这样的方式存储块,我可以像时尚一样以矩阵形式访问块。例如,B [0,0](5x5)给出矩阵A
的第一个块(20x20),假设5x5块,矩阵A
的类型为sparse.lil
。
这样可以正常工作,但是太长时间了。这是低效的,因为它复制了数据,因为这个引用让我惊讶:GetItem Method
有没有办法只在dict中的稀疏矩阵上存储视图?我想更改内容,仍然可以使用相同的标识符。如果需要更长的时间就可以了,因为它应该只进行一次。这些街区将有许多不同的尺寸和形状。
答案 0 :(得分:4)
据我所知,scipy.sparse
中的所有稀疏matricies都返回副本而不是某种视图。 (其他一些人可能比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]
,依此类推。