如何高效替换稀疏数组中小于4的元素:避免警告且不降低稀疏性
Scipy CSR稀疏数组替换元素的正确姿势(不降低稀疏性)
给定如下CSR稀疏数组:
from scipy import sparse x = sparse.csr_matrix( [[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [0, 0, 0, 2, 5]])
如果用x[x < 4] = 0来替换小于4的元素,虽然能实现功能,但会把原本为0的位置也当成非零元素存入矩阵,导致存储的元素从11个增至15个,反而降低了稀疏性,还可能触发SparseEfficiencyWarning。
要解决这个问题,直接操作CSR矩阵的底层存储即可,步骤如下:
- 直接修改
data属性:CSR矩阵的所有非零元素都存在x.data数组里,直接把其中小于4的值设为0 - 调用
eliminate_zeros()方法:清除矩阵存储中的0元素,压缩结构,保持稀疏性
完整代码示例:
# 把非零元素中小于4的设为0 x.data[x.data < 4] = 0 # 清理存储的0元素,恢复稀疏结构 x.eliminate_zeros()
这样操作后,矩阵只会保留原本就非零且≥4的元素,不会新增不必要的存储,稀疏性得到维持,也不会触发效率警告。
内容的提问来源于stack exchange,提问作者ifly6
相关产品推荐
相关产品推荐

