scipy.sparse矩阵的逐元素幂

17

我该如何对一个 scipy.sparse 矩阵进行逐元素的乘方操作?根据它的手册numpy.power 应该可以实现这个功能,但是对于稀疏矩阵却无法实现:

>>> 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的第二个参数不应该是一个数字,而是另一个矩阵。 - RoundTower
看起来它正在调用对象的__pow__方法,试图对整个矩阵进行平方运算,而不是逐个元素进行。这会失败,因为正如它所说,该矩阵不是方阵。 - Thomas K
@RoundTower:实际上,第二个元素应该是一个数组,这不同于Numpy中的矩阵,但对于numpy.power在密集数组上的目的,标量与(1,)(1,1)数组相同。 - Fred Foo
2个回答

21

我刚遇到了同样的问题,并发现稀疏矩阵现在支持逐元素求幂。对于上面的情况,应该是:

 X.power(2)

这是针对Python 2.7的吗? - Aman Mathur
这似乎不适用于Python 3.6。 - yousraHazem
1
可能取决于稀疏矩阵的格式,对于CSR来说似乎可以工作。 - Mikhail Berlinkov

12

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

>>> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接