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 矩阵的元素功率的主要内容,如果未能解决你的问题,请参考以下文章