scipy.sparse.csr_matrix 行过滤 - 如何正确实现?

Posted

技术标签:

【中文标题】scipy.sparse.csr_matrix 行过滤 - 如何正确实现?【英文标题】:scipy.sparse.csr_matrix row filtering - how to properly achieve it? 【发布时间】:2015-06-28 22:59:46 【问题描述】:

我正在使用一些 scipy.sparse.csr_matrixes。老实说,我手头的一个来自 Scikit-learn 的 TfidfVectorizer:

vectorizer = TfidfVectorizer(min_df=0.0005)
textsMet2 = vectorizer.fit_transform(textsMet)

好的,这是一个矩阵:

textsMet2
<999x1632 sparse matrix of type '<class 'numpy.float64'>'
    with 5042 stored elements in Compressed Sparse Row format>

现在我只想获取那些具有任何非零元素的行。所以很明显我会选择简单的索引:

 textsMet2[(textsMet2.sum(axis=1)>0),:]

然后得到一个错误:

文件“D:\Apps\Python\lib\site-packages\scipy\sparse\sputils.py”,第 327 行,在 _boolean_index_to_array raise IndexError('无效的索引形状') IndexError: 无效的索引形状

如果我删除索引的最后一部分,我会得到一些奇怪的东西:

textsMet2[(textsMet2.sum(axis=1)>0)]
<1x492 sparse matrix of type '<class 'numpy.float64'>'
with 1 stored elements in Compressed Sparse Row format>

为什么它只显示 1 行矩阵?

再一次,我想得到这个矩阵中所有非零元素的行。有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

你需要ravel你的面具。这是我目前正在做的事情的一些代码:

tr_matrix = pipeline.fit_transform(train_text, y_train, **fit_params) # 删除特征太少的文档 to_keep_train = tr_matrix.sum(axis=1) >= config['min_train_features'] to_keep_train = np.ravel(np.array(to_keep_train)) logging.info('%d/%d 个火车文件有足够的特征', 总和(to_keep_train),len(y_train)) tr_matrix = tr_matrix[to_keep_train, :]

这有点不雅,但可以完成工作。

【讨论】:

酷,谢谢。没想到它会返回应该重塑的东西 sum(1) 返回 matrix,而不是 sparse matrixnp.ravel(...) 返回一个数组。有时你只需要尝试看看是什么将稀疏矩阵转换为矩阵到数组等。【参考方案2】:

这将删除 0 行和列。

X = X[np.array(np.sum(X,axis=1)).ravel() != 0,:]
X = X[:,np.array(np.sum(X,axis=0)).ravel() != 0]

【讨论】:

以上是关于scipy.sparse.csr_matrix 行过滤 - 如何正确实现?的主要内容,如果未能解决你的问题,请参考以下文章

ndarray 与 scipy.sparse.csr.csr_matrix 的互转

以可移植数据格式保存/加载 scipy sparse csr_matrix

scipy csr_matrix和csc_matrix函数详解

如何从一个巨大的(scipy.sparse)矩阵计算对角矩阵?

从稀疏矩阵导入时出现 Modin AttributeError

python - dict.setdefault