我有两个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
个对象,它将不会进行任何转换。
答案 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_matrix
或csc_matrix
(上面列出的两个条件)的快速路径要求。请查看bat
的整个源代码,以获得更好的理解。如果不符合条件,系统将转发您将矩阵转换为coo_matrix
。
答案 1 :(得分:1)
目前尚不清楚此错误是在hstack
还是在您使用结果之后发生的。
如果它在hstack
中,则需要提供一个追溯,以便我们了解发生了什么。
hstack
使用bmat
,通常会收集所有输入的coo
属性,并将它们组合起来以构成一个新的coo
矩阵。因此,不管输入(特殊情况除外),结果均为coo
。但是hstack
也接受fmt
参数。
或者您可以添加.tocsr()
。如果矩阵已经为csr
,就没有额外的成本。