来自稀疏矩阵的hstack的TypeError

时间:2018-07-30 11:20:20

标签: python numpy scipy sparse-matrix

我有两个CSR稀疏矩阵。一个包含sklearn.feature_extraction.text.TfidfVectorizer的转换,另一个包含numpy数组的转换。我试图对两者进行scipy.sparse.hstack来增加特征矩阵,但是我总是会收到错误:

TypeError: 'coo_matrix' object is not subscriptable

下面是代码:

vectorizer = TfidfVectorizer(analyzer="char", lowercase=True, ngram_range=(1, 2), strip_accents="unicode")
ngram_features = vectorizer.fit_transform(df["strings"].values.astype(str))

list_other_features = ["entropy", "string_length"]
other_features = csr_matrix(df[list_other_features].values)

joined_features = scipy.sparse.hstack((ngram_features, other_features))

两个要素矩阵都是scipy.sparse.csr_matrix对象,我也尝试过不转换other_features,而将其保留为numpy.array,但是会导致相同的错误。

Python软件包版本:

numpy == 1.13.3
pandas == 0.22.0
scipy == 1.1.0

在这种情况下,尤其是当我将两个矩阵都转换为coo_matrix时,我不明白为什么它要谈论csr_matrix对象。查看scipy代码,我知道如果输入矩阵是csr_matrix个对象,它将不会进行任何转换。

2 个答案:

答案 0 :(得分:1)

scipy.sparse.hstack的源代码中,它调用bmat,如果没有建立快速路径的情况,它会潜在地将矩阵转换为coo_matrix


诊断

  

看看我知道的密码,它不会做任何转换   如果输入矩阵是csr_matrix个对象。

bat的{​​{3}}中,除了要成为csr_matrix对象的两个矩阵之外,实际上还有更多条件,除了两个coo_matrix。查看源代码,需要满足以下两个条件之一

# check for fast path cases
if (N == 1 and format in (None, 'csr') and all(isinstance(b, csr_matrix)
                                               for b in blocks.flat)):
    ...
elif (M == 1 and format in (None, 'csc')
      and all(isinstance(b, csc_matrix) for b in blocks.flat)):
    ...

source code A = coo_matrix(blocks[i,j])之前被调用。


建议

要解决此问题,建议您再做一次检查,看看是否满足csr_matrixcsc_matrix(上面列出的两个条件)的快速路径要求。请查看bat的整个源代码,以获得更好的理解。如果不符合条件,系统将转发您将矩阵转换为coo_matrix

答案 1 :(得分:1)

目前尚不清楚此错误是在hstack还是在您使用结果之后发生的。

如果它在hstack中,则需要提供一个追溯,以便我们了解发生了什么。

hstack使用bmat,通常会收集所有输入的coo属性,并将它们组合起来以构成一个新的coo矩阵。因此,不管输入(特殊情况除外),结果均为coo。但是hstack也接受fmt参数。

或者您可以添加.tocsr()。如果矩阵已经为csr,就没有额外的成本。