scipy.sparse 默认值

11 投票
1 回答
4027 浏览
提问于 2025-04-16 19:03

稀疏矩阵格式(dok)假设字典中没有的键的值都是零。有没有办法让它使用其他的默认值,而不是零呢?

另外,有没有办法计算稀疏矩阵的对数,就像在普通的numpy矩阵中使用np.log那样?

1 个回答

8

这个功能并不是内置的,但如果你真的需要,可以自己写一个 dok_matrix 类,或者在 Scipy 的基础上进行扩展。Scipy 的实现可以在 这里 找到。至少在调用 dict.* 的地方,默认值需要进行修改,可能还需要做其他一些调整。

不过,我建议你尝试重新思考一下问题,这样就不需要这个功能了。例如,如果你在做线性代数,可以把常数项单独处理,然后可以这样做:

from scipy.sparse.linalg import LinearOperator
A = whatever_dok_matrix_minus_constant_term
def my_matvec(x):
    return A*x + constant_term * x.sum()
op = LinearOperator(A.shape, matvec=my_matvec)

对于大多数线性代数的操作(比如迭代求解器),你可以传入 op 来代替 A

至于矩阵的对数:稀疏矩阵的对数(像 scipy.linalg.logm 这样)通常是稠密的,所以你应该先把矩阵转换为稠密矩阵,然后再像往常一样计算对数。根据我的观察,使用稀疏矩阵并不会带来性能上的提升。如果你只是想计算一个向量和对数的乘积 log(A) * v,那么一些 Krylov 方法可能会有所帮助。

另一方面,如果你想逐元素计算对数,可以直接修改 .data 属性(至少在 COO、CSR 和 CSC 格式中可用)。

x = A.tocoo()
x.data = np.log(x.data)
A = x.todok()

这样做不会影响零元素,但正如上面所说,这样可以单独处理常数部分。

撰写回答