6

在 numpy 中,如果要计算矩阵的每个条目的正弦(元素化),那么

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

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

a**2

会做的。

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

在 SO 上找到了这个问题并试图调整这个答案,但我没有成功。

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

你有什么建议?

4

1 回答 1

11

以下技巧适用于将零映射到零的任何操作,并且仅适用于这些操作,因为它仅涉及非零元素。即,它适用于sinsqrt不适用于cos.

让我们X成为一些企业社会责任矩阵......

>>> 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()where Xis a sparse matrix 之类的操作,以获取具有X.

于 2012-01-18T09:18:21.220 回答