您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何有效地从稀疏矩阵中删除列?

如何有效地从稀疏矩阵中删除列?

我一直都想要这个,实际上还没有一种很好的内置方法。这是一种方法。我选择制作lil_matrix的子类并添加remove_col函数。如果需要,可以改为将removecol函数添加lib/site- packages/scipy/sparse/lil.py文件中的lil_matrix类中。这是代码

from scipy import sparse
from bisect import bisect_left

class lil2(sparse.lil_matrix):
    def removecol(self,j):
        if j < 0:
            j += self.shape[1]

        if j < 0 or j >= self.shape[1]:
            raise IndexError('column index out of bounds')

        rows = self.rows
        data = self.data
        for i in xrange(self.shape[0]):
            pos = bisect_left(rows[i], j)
            if pos == len(rows[i]):
                continue
            elif rows[i][pos] == j:
                rows[i].pop(pos)
                data[i].pop(pos)
                if pos == len(rows[i]):
                    continue
            for pos2 in xrange(pos,len(rows[i])):
                rows[i][pos2] -= 1

        self._shape = (self._shape[0],self._shape[1]-1)

我已经尝试过了,没有发现任何错误。我当然认为这比将列切成薄片要好,据我所知,这只会创建一个新矩阵。

我决定也要创建一个removerow函数,但我认为它不如removecol好。我受到无法以我想要的方式从ndarray删除一行的限制。这是可以添加到上面的类中的removerow

    def removerow(self,i):
        if i < 0:
            i += self.shape[0]

        if i < 0 or i >= self.shape[0]:
            raise IndexError('row index out of bounds')

        self.rows = numpy.delete(self.rows,i,0)
        self.data = numpy.delete(self.data,i,0)
        self._shape = (self._shape[0]-1,self.shape[1])

也许我应该将这些功能提交到Scipy存储库。

其他 2022/1/1 18:44:38 有426人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶