scipy.sparse 矩阵的元素功率

Posted

技术标签:

【中文标题】scipy.sparse 矩阵的元素功率【英文标题】:Element-wise power of scipy.sparse matrix 【发布时间】:2011-09-19 20:49:09 【问题描述】:

如何将scipy.sparse 矩阵提升到元素级的幂? numpy.power 应该根据its manual 执行此操作,但它在稀疏矩阵上失败:

>>> X
<1353x32100 sparse matrix of type '<type 'numpy.float64'>'
        with 144875 stored elements in Compressed Sparse Row format>

>>> np.power(X, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../scipy/sparse/base.py", line 347, in __pow__
    raise TypeError('matrix is not square')
TypeError: matrix is not square

X**2 也有同样的问题。转换为密集数组可以,但会浪费宝贵的时间。

np.multiply 也遇到了同样的问题,我使用稀疏矩阵的multiply 方法解决了这个问题,但似乎没有pow 方法。

【问题讨论】:

我对 numpy 不够熟悉,无法告诉您答案,但您的代码与文档并不矛盾。 numpy.power 的第二个参数不应该是一个数字,而是另一个矩阵。 看起来它正在调用对象的__pow__ 方法,该方法试图对整个矩阵求平方,而不是按元素进行。这失败了,因为正如它所说,矩阵不是正方形的。 @RoundTower:实际上,第二个元素应该是一个数组,它与 Numpy 中的矩阵不同,但标量与 (1,)(1,1) 数组相同numpy.power 在密集阵列上的用途。 【参考方案1】:

我刚刚遇到了同样的问题,发现稀疏矩阵现在支持按元素计算的能力。对于上面的情况,应该是:

 X.power(2)

【讨论】:

这适用于 python 2.7 吗? 这似乎不适用于 python 3.6 它可能取决于稀疏矩阵的格式,对于 csr 它似乎可以工作【参考方案2】:

这有点低级,但对于元素操作,您可以直接使用底层数据数组:

>>> import scipy.sparse
>>> X = scipy.sparse.rand(1000,1000, density=0.003)
>>> X = scipy.sparse.csr_matrix(X)
>>> Y = X.copy()
>>> Y.data **= 3
>>> 
>>> abs((X.toarray()**3-Y.toarray())).max()
0.0

【讨论】:

以上是关于scipy.sparse 矩阵的元素功率的主要内容,如果未能解决你的问题,请参考以下文章

Scipy---6.稀疏矩阵

为啥 scipy sparse 和 numpy 数组的乘法函数会给出不同的结果?

Scipy sparse的CSC矩阵总结

SciPySparse稀疏矩阵主要存储格式总结(转载)

Python scipy.sparse矩阵使用方法

Python scipy.sparse矩阵使用方法