我有一个很大的稀疏矩阵。我想对{稀疏矩阵中的所有元素取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
这并不像我预期的那么快。有更快的方法吗?
答案 0 :(得分:3)
您可以直接修改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. ]])
请注意,如果稀疏格式具有重复元素(在COO格式中有效),则无法正常工作;它会单独记录日志,并log(a) + log(b) != log(a + b)
。您可能希望首先转换为CSR或CSC(这很快)以避免此问题。
当然,如果稀疏矩阵采用不同的格式,您还必须添加检查。如果您不想在原地修改矩阵,只需像在答案中那样构建一个新的稀疏矩阵,但不添加3
,因为这里完全没有必要。
答案 1 :(得分: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)