2d 희소 배열이 있다고 가정합니다.scipy.sparse 행렬을 브로드 캐스트 된 1 차원 배열로 요소 단위로 곱하는 방법은 무엇입니까?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
을 지금은 모두와 고밀도 1D 배열이 있다고 가정 내 진짜 유스 케이스에서 행과 열의 수를 모두 (20000 및 50000을 말한다) 조밀 한 표현이 사용되는 경우 따라서는 메모리에 맞지 않을 수 있습니다 훨씬 더 큰 있습니다 (내 실제 생활 경우 또는 50000) 크기의 3 비 - 제로 구성 요소 :
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
나는의 elementwise 곱셈을 계산하기 좋아하고 NumPy와의 일반적인 방송의 의미를 사용하는 거라고합니다. 그러나, scipy 스파 스 매트릭스는 np.matrix의 다음과 같습니다 '*'연산자 대신의-곱셈 매트릭스처럼 행동해야하는 오버로드 된 elementwise - 곱셈 :
>>> a * d
array([ 0., -3., 0., 0., 6.])
하나의 해결책은 '할 것 *는 '을위한 배열 의미로 전환' '연산자, 즉 예상 된 결과 줄 것입니다 :
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
을하지만 호출으로써 toArray()가의 조밀 한 버전 실현 것이라고 할 수 없다'A '를하는 메모리에 맞지 않습니다 (결과도 빽빽하게 나타납니다).
>>> ssp.issparse(a.toarray())
False
'a'열에 비효율적 인 파이썬 루프를 수행 할 필요없이 드문 드문 한 데이터 구조 만 유지하면서 어떻게 구축 할 것인지 생각하십시오.
''d'가 사용할 수 A' a.multiply '(d)'과 동일한 크기의 희소 행렬 인 경우. 아마도''d '를 N 행으로 만들고'a'의 N 행을 한 번에 반복 할 수 있습니까? – mtrw
그러나 d는 밀도가 높으며 곱셈 모양 요구 사항을 충족시키기 위해 메모리에 명시 적으로 브로드 캐스트 할 수 없습니다. 일괄 처리 루핑은 옵션이지만 조금 hackish 찾으십시오. 나는 파이썬 루프없이 이것을 수행 할 바닐라 벡터화/scipy 방법이 있다고 생각했을 것이다. – ogrisel
나는 (희소 한) 모체의 표현을 원하지만 배열의 다중 연산을 원한다고 생각한다. 나는 불행하게도 당신 자신을 굴려야한다고 생각합니다. – mtrw