在稀疏矩阵中采用对数函数的有效方法

Bas*_*aya 5 python numpy matrix scipy sparse-matrix

我有一个很大的稀疏矩阵.我想采取log4稀疏矩阵中的所有元素.

我尝试使用,numpy.log()但它不适用于矩阵.

我也可以逐行取对数.然后我用一个新的粉碎旧行.

# Assume A is a sparse matrix (Linked List Format) with float values as data
# It is only for one row

import numpy as np
c = np.log(A.getrow(0)) / numpy.log(4)
A[0, :] = c
Run Code Online (Sandbox Code Playgroud)

这并不像我预期的那么快.有更快的方法吗?

Dou*_*gal 8

可以data直接修改属性:

>>> a = np.array([[5,0,0,0,0,0,0],[0,0,0,0,2,0,0]])
>>> coo = coo_matrix(a)
>>> coo.data
array([5, 2])
>>> coo.data = np.log(coo.data)
>>> coo.data
array([ 1.60943791,  0.69314718])
>>> coo.todense()
matrix([[ 1.60943791,  0.        ,  0.        ,  0.        ,  0.        ,
          0.        ,  0.        ],
        [ 0.        ,  0.        ,  0.        ,  0.        ,  0.69314718,
          0.        ,  0.        ]])
Run Code Online (Sandbox Code Playgroud)

请注意,如果稀疏格式具有重复元素(在 COO 格式中有效),则这将无法正常工作;它将单独获取日志,并且log(a) + log(b) != log(a + b). 您可能希望先转换为 CSR 或 CSC(速度很快)以避免此问题。

当然,如果稀疏矩阵的格式不同,您还必须添加检查。如果您不想就地修改矩阵,只需像您在答案中所做的那样构造一个新的稀疏矩阵,但不要添加,3因为这里完全没有必要。


Bas*_*aya 0

我想我可以用非常简单的方法解决它。很奇怪,没有人能够立即回答。

# Let A be a COO_matrix
import numpy as np
from scipy.sparse import coo_matrix
new_data = np.log(A.data+3)/np.log(4) #3 is not so important. It can be 1 too.
A = coo_matrix((new_data, (A.row, A.col)), shape=A.shape)
Run Code Online (Sandbox Code Playgroud)

  • 没有人提出这个解决方案,因为它在数学上是不正确的。`log(x)` 可能与 `log(x+1)` 有很大不同!(例如:“log(0.000001) = -6”、“log(0.0000001 + 1 = 0 和一点”。 (6认同)