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



我正在使用一些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 引发索引错误("无效的索引形状")索引错误: 无效的索引形状

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

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

为什么它只显示 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), 透镜(y_train))    tr_matrix = tr_matrix[to_keep_train, :]

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

这将删除 0 行和列。

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

最新更新