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

Auf*_*ind 6 python numpy operation scipy

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

a = numpy.arange(0,27,3).reshape(3,3)
numpy.sin(a)
Run Code Online (Sandbox Code Playgroud)

将完成工作!如果你想要电源让我们说每个条目2

a**2
Run Code Online (Sandbox Code Playgroud)

会做的.

但是,如果你有一个稀疏矩阵,事情似乎更难.至少我还没有找到一种方法来做到这一点,除了遍历lil_matrix格式的每个条目并对其进行操作.

在SO上发现了这个问题,并尝试调整这个答案,但我没有成功.

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

你会建议什么?

Fre*_*Foo 11

以下技巧适用于将零映射到零的任何操作,并且仅适用于那些操作,因为它仅触及非零元素.即,它将起作用sin,sqrt但不起作用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.]])
Run Code Online (Sandbox Code Playgroud)

非零元素的值是X.data:

>>> X.data
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
Run Code Online (Sandbox Code Playgroud)

您可以就地更新:

>>> 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.        ]])
Run Code Online (Sandbox Code Playgroud)

更新在最近版本的SciPy的,你可以做这样的事情X.sqrt()哪里X是一个稀疏矩阵得到一个新的副本平方根中的元素X.

  • @Aufwind:我厌倦了对`.data`进行操作,我向Scipy提交了[补丁](https://github.com/scipy/scipy/pull/138),实现了`sqrt`,`sin` CSR和CSC矩阵上的`tan`. (4认同)