Python 更改列时出现稀疏效率警告

Python 更改列时出现稀疏效率警告,python,numpy,scipy,nlp,Python,Numpy,Scipy,Nlp,我想手动设置tdm矩阵中某些项的零权重。使用上面的代码,我得到了警告。我似乎不明白为什么?有更好的方法吗 def tdm_modify(feature_names,tdm): non_useful_words=['kill','stampede','trigger','cause','death','hospital'\ ,'minister','said','told','say','injury','victim','report'] indexes=[fea

我想手动设置tdm矩阵中某些项的零权重。使用上面的代码,我得到了警告。我似乎不明白为什么?有更好的方法吗

def tdm_modify(feature_names,tdm):
    non_useful_words=['kill','stampede','trigger','cause','death','hospital'\
        ,'minister','said','told','say','injury','victim','report']
    indexes=[feature_names.index(word) for word in non_useful_words]
    for index in indexes:
        tdm[:,index]=0   
    return tdm

首先,这不是一个错误。这是一个警告。下次执行此操作(在会话中)时,它将在没有警告的情况下执行此操作

对我来说,信息是明确的:

C:\Anaconda\lib\site-packages\scipy\sparse\compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  SparseEfficiencyWarning)
tdm
是一个
csr\u矩阵
。以这种格式存储数据的方式,将一组元素设置为0(或将它们从0更改为v.v)需要相当多的额外计算。正如它所说的,如果您需要经常进行此类更改,那么
lil_矩阵
格式会更好

在样本矩阵上尝试一些时间测试
tdm.tolil()
将矩阵转换为
lil
格式

我可以了解数据是如何存储的,以及为什么更改
csr
的效率低于
lil

我建议查看
sparse
格式及其各自的优缺点

一个简单的思考方法是-
csr
(和
csc
)设计用于快速数值计算,特别是矩阵乘法。他们研究线性代数问题
coo
是定义稀疏矩阵的一种方便方法
lil
是一种以增量方式构建矩阵的方便方法

您最初是如何构建tdm的


scipy
测试文件(例如
scipy/sparse/linalg/dsolve/tests/test\u linsolve.py
)中,我找到了这样的代码

Changing the sparsity structure of a csr_matrix is expensive. 
lil_matrix is more efficient.
scipy/sparse/base.py

import warnings
from scipy.sparse import (spdiags, SparseEfficiencyWarning, csc_matrix,
    csr_matrix, isspmatrix, dok_matrix, lil_matrix, bsr_matrix)
warnings.simplefilter('ignore',SparseEfficiencyWarning)

这些警告使用标准的Python
Warning
类,因此用于控制其表达式的标准Python方法适用。

我在处理机器学习问题时也遇到了此警告消息。确切的应用是从文本语料库构建文档术语矩阵。我同意公认的答案。我将补充一个经验观察:

我的确切任务是构建一个25000 x 90000的uint8矩阵。 我想要的输出是稀疏矩阵压缩行格式,即csr_矩阵

到目前为止,最快的方法是使用np.zeros()初始化一个稠密矩阵,建立它,然后在最后执行一次csr_矩阵(稠密矩阵),这是以在此期间使用更多内存为代价的

第二种最快的方法是建立lil_矩阵,然后使用.tocsr()方法将其转换为csr_矩阵。这是公认答案中的建议。(谢谢你)

最慢的方法是逐个元素组装csr_矩阵


总之,如果你有足够的工作内存来构建一个密集矩阵,并且为了下游的效率,你只想在以后得到一个稀疏矩阵,那么以密集格式构建矩阵并在最后对其进行一次转换可能会更快。如果由于内存限制,您需要始终以稀疏格式工作,则将矩阵构建为lil_矩阵,然后将其转换(如接受的答案所示)比从一开始构建csr_矩阵要快。

如何禁用此警告?我正在运行一个脚本,此消息将打印到stdout。这很烦人,因为我必须解析它才能得到我想要的结果。如果有任何scipy开发人员,我真的认为这个消息应该在文档中。它不应该被打印到控制台,甚至一次也不应该。我已经找到了一些抑制警告的选项。您是否考虑过更改脚本以使其不会发出此警告?例如,通过更改稀疏格式。警告的存在是有原因的。注意它是值得的。其他格式不允许我更改值。我在脚本中只做了一次,所以性能不是问题。实际上@hpaulj没有提到
.tocsr()
class SparseWarning(Warning):
    pass
class SparseFormatWarning(SparseWarning):
    pass
class SparseEfficiencyWarning(SparseWarning):
    pass