如何在scipy稀疏矩阵上创建view/python引用?

Jon*_*nas 5 python view scipy sparse-matrix

我正在研究一种算法,该算法使用一个大的(将是e06 x e06)块对角线稀疏矩阵的对角线和第一个非对角线块.

现在我创建一个dict,以这样的方式存储块,我可以像时尚一样以矩阵形式访问块.例如,B [0,0](5x5)给出第一个矩阵块A(20x20),假设5x5块并且该矩阵A是类型的sparse.lil.

这样可以正常运行,但运行时间太长了.这是低效的,因为它复制数据,因为这个引用让我惊讶:GetItem方法

有没有办法只在dict中的稀疏矩阵上存储视图?我想更改内容,仍然可以使用相同的标识符.如果需要更长的时间就可以了,因为它应该只进行一次.块将具有许多不同的尺寸和形状.

Joe*_*ton 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
Run Code Online (Sandbox Code Playgroud)

现在,每当我们修改它时,s[whatever]它都会修改s.data相应的块。换句话说,s[0,0]will return 或 set s.data[:5, :5],等等。