编程语言
首页 > 编程语言> > python – scipy.sparse默认值

python – scipy.sparse默认值

作者:互联网

稀疏矩阵格式(dok)假设不在字典中的键的值等于零.有没有办法让它使用除零以外的默认值?

还有,有办法计算稀疏矩阵的日志(类似于常规numpy矩阵中的np.log)

解决方法:

该功能不是内置的,但如果你真的需要这个,你应该能够编写自己的dok_matrix类,或者是Scipy的子类. Scipy实现在这里:https://github.com/scipy/scipy/blob/master/scipy/sparse/dok.py至少在进行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方法可能会有所帮助.

如果OTOH想要以元素方式计算对数,则可以直接修改.data属性(至少在COO,CSR和CSC中可用)

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

这使零元素单独存在,但如上所述,这允许单独处理恒定部分.

标签:python,scipy,sparse-matrix
来源: https://codeday.me/bug/20191006/1862034.html