我有一个很大的稀疏矩阵。我想对稀疏矩阵中的所有元素取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

这没有我想象的那么快。有没有更快的方法来做这个?

最佳答案

您可以直接修改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.        ]])

请注意,如果sparse格式有重复的元素(在coo格式中是有效的),那么这将无法正常工作;它将单独获取日志,并且log(a) + log(b) != log(a + b)。您可能希望先转换为csr或csc(这很快),以避免此问题。
当然,您还必须添加检查稀疏矩阵是否采用不同的格式。如果你不想修改矩阵,只需像你在答案中那样构造一个新的稀疏矩阵,但不要添加3,因为这在这里是完全不必要的。

07-25 22:14