2011-06-21 16 views
14

scipy.sparse行列を要素単位で累乗するにはどうすればよいですか? numpy.powerは、its manualによると、これを行う必要がありますが、それはスパース行列に失敗:scipy.sparse行列の要素単位の電力

>>> 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メソッドがないようです。

+0

私は答えが分かりませんが、あなたのコードはドキュメントと矛盾していません。 numpy.powerの第2引数は数値ではなく、別の行列であるべきです。 – RoundTower

+0

オブジェクトの '__pow__'メソッドが呼び出されているようですが、これは要素全体を処理するのではなく、行列全体を二乗しようとしています。それは、行列が正方形ではないという理由で失敗します。 –

+0

@RoundTower:実際には、2番目の要素は配列でなければなりません.Numpyの行列と同じではありませんが、スカラーは '(1、)'または '(1,1)'配列と同じです。密集した配列上の 'numpy.power'の目的です。 –

答えて

9

これは少し低レベルであるが、要素ごとの操作のために、あなたは直接基礎となるデータ列を扱うことができます:

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

私はちょうど同じ質問に走ったと疎行列が今の要素をサポートしていることを見つけますとする。上記の場合、それは次のようにする必要があります:

+0

これはPython 2.7用ですか? –

関連する問題