为什么scipy的csr_matrix调用eliminate_zeros()未移除零值条目?
问题原因
你遇到的情况是对eliminate_zeros方法的作用范围存在误解,和稀疏矩阵的底层存储逻辑有关:
- 首先CSR格式的稀疏矩阵本身不会存储逻辑上为0的元素:它仅通过
data数组存储显式的非零值,所有不在data数组内的坐标位置,访问时默认返回0,这是稀疏矩阵的固有特性,和eliminate_zeros无关。 eliminate_zeros的作用是删除已经被显式存储在data数组中的0值条目,通常用于你手动修改矩阵把某已存储的非零值设为0后的清理场景,而不是用来清除矩阵逻辑上所有的0值位置。
生效场景演示
你可以参考下面的代码理解它的实际作用:
import numpy as np from scipy.sparse import csr_matrix arr = np.array([[0,0,0], [0,0,1], [1,0,1]]) mat = csr_matrix(arr) # 手动把已存储的非零值改为0,此时这个0会留在data数组里 mat[1,2] = 0 print("修改后未调用eliminate_zeros的data数组:", mat.data) # 输出:修改后未调用eliminate_zeros的data数组: [1 1 0] mat.eliminate_zeros() print("调用eliminate_zeros后的data数组:", mat.data) # 输出:调用eliminate_zeros后的data数组: [1 1]
你的代码运行说明
你初始化csr_matrix(arr)时,scipy会自动过滤掉输入数组中的0值,data数组里本来就没有0条目,所以调用eliminate_zeros不会产生任何变化,你访问未存储的位置返回0是稀疏矩阵的默认返回值,不是eliminate_zeros没有生效。
另外你给出的运行输出最后一行第三个元素为2,和输入数组的原始值不符,属于示例运行异常,可以检查下是否实际运行时不小心修改了数组赋值逻辑,正常运行你给出的代码输出会和原输入数组完全一致。
内容的提问来源于stack exchange,提问作者Nameless
相关产品推荐
相关产品推荐

