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

Bra*_*rey 15 python numpy algebra matrix scipy

如果我使用的是sparse.lil_matrix格式,如何轻松有效地从矩阵中删除列?

New*_*wmu 11

更简单,更快捷.您可能甚至不需要转换为csr,但我只知道它与csr稀疏矩阵一起工作并且之间的转换应该不是问题.

from scipy import sparse

x_new = sparse.lil_matrix(sparse.csr_matrix(x)[:,col_list])
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用CSR(压缩稀疏行)矩阵进行列切片?CSR格式的一个缺点是'慢列切片操作(考虑CSC)'(根据scipy docs).您可能应该使用`csc_matrix`转换. (2认同)

Jus*_*eel 8

我一直都想要这个,事实上还没有一个很好的内置方法来做到这一点.这是一种方法.我选择创建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)
Run Code Online (Sandbox Code Playgroud)

我试过了,没有看到任何错误.我当然认为它比切出列更好,据我所知,这只是创建一个新矩阵.

我决定制作一个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])
Run Code Online (Sandbox Code Playgroud)

也许我应该将这些函数提交给Scipy存储库.


JRu*_*Run 8

对于稀疏 csr 矩阵 (X) 和要删除的索引列表 (index_to_drop):

to_keep = list(set(xrange(X.shape[1]))-set(index_to_drop))    
new_X = X[:,to_keep]
Run Code Online (Sandbox Code Playgroud)

将 lil_matrices 转换为 csr_matrices 很容易。检查lil_matrix 文档中的tocsr()

但是请注意,使用 tolil() 从 csr 到 lil 矩阵是昂贵的。因此,当您不需要将矩阵设为 lil 格式时,此选择是不错的选择。