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)
我一直都想要这个,事实上还没有一个很好的内置方法来做到这一点.这是一种方法.我选择创建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存储库.
对于稀疏 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 格式时,此选择是不错的选择。