2016-11-17 2 views
2

I 모양 및 형상 (k,N)(N,n)와 제 2 어레이와 Xnumpy 배열 Z있다.사용 방송

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

이 잘 작동 의외로 빨리 :

numpy 방송을 이용하여 I 쉽게 그 슬라이스 행 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

2 차원 제한 외에도 스파 스 수학은 다른 스파 스 매트릭스에서만 작동합니다. 밀도가 높은 배열로 작업 할 때 스파 스 행렬은 밀도가 높은 행렬로 변환됩니다. 다양한 수학 연산에서 어떤 일이 일어나는지 보려면'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입니다.