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

时间:2015-04-21 16:28:33

标签: python numpy matrix scipy sparse-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),:]

并收到错误:

文件&#34; D:\ Apps \ Python \ lib \ site-packages \ scipy \ sparse \ sputils.py&#34;,第327行,在_boolean_index_to_array中     引发IndexError(&#39;无效的索引形状&#39;) 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行矩阵?

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

2 个答案:

答案 0 :(得分:1)

你需要ravel你的面具。以下是我目前正在处理的事情的一些代码:

    tr_matrix = pipeline.fit_transform(train_text, y_train, **fit_params)

    # remove documents with too few features
    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 train documents have enough features', 
                 sum(to_keep_train), len(y_train))
    tr_matrix = tr_matrix[to_keep_train, :]

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

答案 1 :(得分:0)

这将删除 0 行和列。

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