如何对scipy.sparse.csr_matrix类型的矩阵进行元素操作?

6 投票
1 回答
4999 浏览
提问于 2025-04-17 10:30

在numpy中,如果你想计算一个矩阵中每个元素的正弦值(也就是逐个计算),那么

a = numpy.arange(0,27,3).reshape(3,3)
numpy.sin(a)

就可以完成这个任务!如果你想把每个元素的值平方,比如说2次方的话,

a**2

也能做到。

但是如果你有一个稀疏矩阵,事情就变得复杂了。至少我还没找到其他方法,除了逐个遍历一个lil_matrix格式的矩阵并对每个元素进行操作。

我在网上找到过这个问题,并尝试调整这个回答,但没有成功。

我的目标是计算一个CSR格式的scipy.sparse矩阵中每个元素的平方根(或者说是1/2次方)。

你有什么建议吗?

1 个回答

13

下面这个技巧适用于任何把零映射到零的操作,而且只适用于这些操作,因为它只处理非零的元素。也就是说,它适用于 sinsqrt,但不适用于 cos

假设 X 是一个CSR矩阵...

>>> from scipy.sparse import csr_matrix
>>> X = csr_matrix(np.arange(10).reshape(2, 5), dtype=np.float)
>>> X.A
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.]])

非零元素的值在 X.data 中:

>>> X.data
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])

你可以直接在这里更新这些值:

>>> X.data[:] = np.sqrt(X.data)
>>> X.A
array([[ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ],
       [ 2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ]])

更新 在最近的SciPy版本中,你可以像这样使用 X.sqrt(),其中 X 是一个稀疏矩阵,这样可以得到一个新的副本,里面是 X 中元素的平方根。

撰写回答