加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 22:18:04 所属栏目:Python 来源:网络整理
导读:我正在研究一种算法,该算法使用一个大的(将是e06 x e06)块对角线稀疏矩阵的对角线和第一个非对角线块. 现在我创建一个dict,以这样的方式存储块,我可以像时尚一样以矩阵形式访问块.例如,B [0,0](55)给出矩阵A的第一个块(2020),假设55块,并且矩阵A是sparse.lil

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

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

这样可以正常运行,但运行时间太长了.这是低效的,因为它复制数据,因为这个参考显示我的惊讶:GetItem Method

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

最佳答案
据我所知,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 [无论]它将修改相应块的s.data.换句话说,s [0,0]将返回或设置s.data [:5,:5],依此类推.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读