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

时间:2012-01-18 07:18:28

标签: python numpy scipy operation

如果你想计算矩阵(elementise)的每个条目的正弦,那么

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

将完成工作!如果你想要权力让我们说出每个条目中的2个

a**2

会这样做。

但是如果你有一个稀疏矩阵,事情似乎更难。至少我还没想办法,除了迭代lil_matrix格式的每个条目并对其进行操作。

我找到this question on SO并尝试调整this answer,但我没有成功。

目标是以元素方式计算CSR格式的scipy.sparse矩阵的squareroot(或1/2的幂)。

你会建议什么?

1 个答案:

答案 0 :(得分:11)

以下技巧适用于将零映射到零的任何操作,并且仅适用于那些操作,因为它仅触及非零元素。即,它适用于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是一个稀疏矩阵,以获取{{1}的平方根的新副本{1}}。