2016-11-17 9 views
2

numpyの配列Zの形は(k,N)で、第2の配列Xの形は(N,n)です。疎なscipy行列での放送の使用

H = Z.reshape((1, k, N)) * X.T.reshape((n, 1, N)) 

これは正常に動作し、驚くほど速いです:

numpy放送を使用して、私は簡単にそのスライス行Xの列を掛けてきた配列Zある形状(n,k,N)で新しい配列Hを得ることができます。 今、Xは非常にまばらです。この操作をスパース行列操作を使用してさらに高速化したいと考えています。私は、次の操作を実行する場合

は、しかし:

import scipy.sparse as sprs 
spX = sprs.csr_matrix(X) 
H = (Z.reshape((1,k,N))*spX.T.reshape((n,1,N))).dot(Z.T) 

私は次のエラーを取得する:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\scipy\sparse\base.py", line 126, in reshape 
    self.__class__.__name__) 
NotImplementedError: Reshaping not implemented for csc_matrix. 

は、スパースscipy行列で放送を使用する方法はありますか?

+0

2dの制限に加えて、疎な数学は他の疎な行列でしか動作しません。密な配列で作業する場合、疎な行列は密な行列に変換されます。様々な数学演算で何が起こるかを見るには 'spX'を使いましょう。 – hpaulj

答えて

1

Scipyスパース行列は2D形状に限定されています。しかし、あなたは「まばらな」方法でnumpyのを使用することができます。

H = np.zeros((n,k,N), np.result_type(Z, X)) 
I, J = np.nonzero(X) 
Z_ = np.broadcast_to(Z, H.shape) 
H[J,:,I] = Z_[J,:,I] * X[I,J,None] 

は、残念ながら結果Hはまだ密な配列です。

N.b. Noneによるインデックス付けは、目的の軸に単位長の次元を追加する便利な方法です。高度なインデックスとスライスを組み合わせたときの結果の順番はexplained in the docsです。

関連する問題