如何在Scipy稀疏矩阵上创建视图/Python引用?

5
我正在开发一种算法,该算法使用大型(将是e06 x e06)块对角稀疏矩阵的对角线和第一个非对角线块。
目前,我创建了一个字典,以这样一种方式存储块,使得我可以像访问矩阵一样访问块。例如,假设矩阵Asparse.lil类型,B[0,0](5x5)给出了20x20矩阵的第一个块。
这个方法可以工作,但运行时间太长。它是低效的,因为它复制数据,正如这个引用所显示的那样:GetItem Method 有没有一种方法只在字典中存储稀疏矩阵的视图?我想更改内容并仍然能够使用相同的标识符。如果它需要更长时间,那也没关系,因为它应该只做一次。这些块将具有许多不同的尺寸和形状。
1个回答

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
请注意,自版本0.11.0以来,SciPy有一个(分块对角线函数)[docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.block_diag.html#scipy.sparse.block_diag],看起来在这里应该会有所帮助。 - drevicko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接