scipy.稀疏默认值

os8fio9y  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(154)

稀疏矩阵格式(dok)假设字典中没有的键值等于零。有没有办法让它使用除零以外的默认值?
另外,是否有方法计算稀疏矩阵的对数(类似于正则numpy矩阵中的np.log)?

k4ymrczo

k4ymrczo1#

这个特性不是内置的,但是如果你真的需要这个特性,你应该能够编写你自己的dok_matrix类,或者Scipy的子类。Scipy的实现是here。至少在调用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()

这使得零元素单独存在,但如上所述,这允许单独处理常数部分。

相关问题