稀疏矩阵的hstack类型错误

2024-05-07 23:47:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个csr稀疏矩阵。一个包含来自sklearn.feature_extraction.text.TfidfVectorizer的转换,另一个包含从numpy数组转换的转换。我试图对这两个元素做一个scipy.sparse.hstack来增加我的特性矩阵,但是我总是得到错误:

TypeError: 'coo_matrix' object is not subscriptable

代码如下:

^{pr2}$

这两个特征矩阵都是scipy.sparse.csr_matrix对象,我也尝试过不转换其他特征,将其保留为numpy.array,但结果是相同的。在

Python包版本:

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

我不明白为什么在这个例子中它在谈论coo_matrix对象,特别是当我把两个矩阵都转换成csr_matrix时。看看scipy代码,我明白如果输入矩阵是csr_matrix对象,它将不会进行任何转换。在


Tags: 对象代码textnumpy矩阵scipy特征sklearn
2条回答

^{}的源代码中,它调用^{},如果没有建立快速路径用例,它在其中可能将矩阵转换为coo_matrix。在


诊断

Looking at the scipy code I understand it will not do any conversion if the input matrices are csr_matrix objects.

batsource code中,除了两个矩阵是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)):
    ...

在要调用的line 573A = coo_matrix(blocks[i,j])之前。在


建议

为了解决这个问题,我建议您再检查一下是否满足csr_matrix或{}(上面列出的两个条件)的快速路径情况。请查看bat的完整源代码以获得更好的理解。如果不满足条件,则会将您转发到将矩阵转换为coo_matrix。在

不清楚这个错误是在hstack中还是在使用结果之后发生。在

如果它在hstack中,您需要提供一个回溯,这样我们就可以看到发生了什么。在

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

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

相关问题 更多 >