2012-01-18 7 views
4

당신이 scipy.sparse.csr_matrix 유형의 행렬에서 elementwise를 조작하는 방법은 무엇입니까? NumPy와에서

a = numpy.arange(0,27,3).reshape(3,3) 
numpy.sin(a) 

이 작업이 완료 얻을 것이다

다음 매트릭스 (elementise)의 각 항목의 부비동을 계산하려면! 전원을 원한다면 각 항목의 2 개를 말하십시오

할 것입니다.

그러나 희소 행렬을 사용하면 일이 더 어려워 보입니다. 적어도 나는 lil_matrix 형식의 각 엔트리를 반복하는 것 외에는 그렇게 할 수있는 방법을 찾지 못했습니다.

this question on SO을 찾았으며 this answer을 적용하려고했지만 성공적이지 않았습니다.

목표는 CSR 형식의 scipy.sparse 매트릭스의 squareroot (또는 1/2의 지수)를 요소별로 계산하는 것입니다.

무엇을 제안하겠습니까?

+0

[element-wise power of scipy.sparse matrix] (http://stackoverflow.com/questions/6431557/element-wise-power-of-scipy-parse-matrix) –

답변

10

다음 트릭은 0이 아닌 요소 만 다루기 때문에 0으로 매핑하는 모든 연산과 해당 연산에만 적용됩니다. 즉, 및 sqrt에 대해서는 작동하지만 cos에는 작동하지 않습니다.

>>> X.data 
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

하는이 자리에서 업데이트 할 수 있습니다 :

>>> X.data[:] = np.sqrt(X.data) 
>>> X.A 
array([[ 0.  , 1.  , 1.41421356, 1.73205081, 2.  ], 
     [ 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.  ]]) 

하자가

>>> from scipy.sparse import csr_matrix 
>>> X = csr_matrix(np.arange(10).reshape(2, 5), dtype=np.float) 
>>> X.A 
array([[ 0., 1., 2., 3., 4.], 
     [ 5., 6., 7., 8., 9.]]) 

0이 아닌 요소의 값이 X.data 있습니다 ... 일부 CSR의 행렬 X

업데이트 최근 버전 SciPy의 ns라면 과 같은 일을 할 수 있습니다. X은 요소의 제곱근을 사용하여 새 복사본을 얻는 스파 스 매트릭스입니다. X.

+0

굉장하고, 감사합니다! – Aufwind

+4

@Aufwind : 필자는'.data'에서 작동하는데 지겹고 아파서 [patch] (https://github.com/scipy/scipy/pull/138)를 Scipy에게'sqrt','sin CSR 및 CSC 매트릭스에 대해 '황갈색'이라고 답했다. –

+0

이것은 대단하다, 나는 많은 사람들이 verythankful 될 것이라고 확신합니다! :-) – Aufwind