【问题标题】:scipy.sparse default valuescipy.sparse 默认值
【发布时间】:2011-09-09 12:24:18
【问题描述】:

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

另外,有没有办法计算稀疏矩阵的对数(类似于常规 numpy 矩阵中的 np.log)

【问题讨论】:

    标签: python scipy sparse-matrix


    【解决方案1】:

    该功能不是内置的,但如果你真的需要这个,你应该可以编写自己的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()
    

    这会单独处理零元素,但如上所述,这允许单独处理常量部分。

    【讨论】:

    • 谢谢!可惜这些简单的功能还没有直接实现:(
    • 我想说这对于稀疏矩阵来说是一个相当特殊而不是简单的功能:) 我不知道这些东西是否在其他稀疏矩阵包中实现,但 AFAIK Matlab 没有好像有这样的东西。问题是,如果“缺失”值不为零,您可以对稀疏矩阵执行的许多操作(例如分解等)将无法正常工作。
    • @pv 是的。我同意你的默认值问题。但是其他的东西,比如计算矩阵的对数应该已经实现了。有点琐碎。对于某些类型的稀疏矩阵 X+1 有效,但 1+X 引发未实现的异常:D
    猜你喜欢
    • 2018-09-12
    • 2015-05-22
    • 1970-01-01
    • 2019-07-05
    • 2010-12-05
    • 2012-03-17
    • 2012-07-13
    • 2015-06-24
    • 2013-09-24
    相关资源
    最近更新 更多