2017-05-05 3 views
2

Scipy (v0.18.1)에서 부울 연산을 사용하는 스파 스 (이진) 배열의 열을 결합하고 싶습니다. 조밀 한 행렬의 경우 다음을 수행하면됩니다.Scipy 스파 스 매트릭스 : 부울 값의 조합

data[:,5] & ~data[:,23] & data[:,400] 

단일 열로 축소됩니다. 그러나 스파 스 배열로이 작업을 수행 할 때 오류가 발생합니다. 부울 부분에 대한

오류 :

bad operand type for unary ~: 'csc_matrix' 
+1

단항'~'을 적용하기 전에 조각을 조밀하게 변환해야 할 수도 있습니다. 스파 스 매트릭스를 반전 시키면 어쨌든 (아마도 _ 매우 _) 밀집한 매트릭스가됩니다. –

+1

@ 루카 시티 좋은 지적! 그들은 성능 (및 일관성) 이유로이 기능을 구현하지 않았기 때문에 스파 스 매트릭스의 보완이 실제로 더 이상 발생하지 않습니다. –

+0

@ LucaCiti 그래, 어쩌면 내가 0이 아닌 요소를 체크하는 트릭을 할 수는 있겠지만. 부울 부분은 어떻습니까? – cgreen

답변

0

하나는 elementwise 곱셈 a.multiply(b)을 사용할 수 있습니다 ("와") 및 추가 a+b ("또는 다음 ~ (반전) 부분에 대한

"unsupported operand type(s) for &: 'csc_matrix' and 'csc_matrix'" 

오류 ")을 사용하여 이진 연산을 구현할 수 있습니다. 부정의 경우 ~에 대해, 희소 행렬의 부정은 어쨌든 (아마도) 매우 조밀 한 행렬을 제공 할 것이므로 밀도로 슬라이스를 변환 할 가치가 있습니다. 경우에 따라 De Morgan의 법률을주의 깊게 사용하면 상당한 차이가 발생할 수 있으며 가능한 경우 그러한 전환의 필요성을 피할 수 있습니다.

data[:,5] & ~data[:,23]의 가능한 속임수는 data[:,5] > data[:,23] 일 수 있습니다.

data[:,5] & ~data[:,23] & data[:,400]은 매우 읽기 쉽지 만 (data[:,5] > data[:,23]).multiply(data[:,400])으로 작성 될 수 있습니다.

+0

(1000,1000) 행렬에서 다양한 조합을 시도했는데 단순히 3 개의 열을 인덱싱하면 타이밍이 우세하다는 것을 알게되었습니다. – hpaulj

+0

@hpaulj 아마도 그것은 작은 매트릭스이며 밀도가 높은 매트릭스를 사용하면 실제로 더 빠를 수 있습니다. 자연 언어 처리에서 문서 용어 매트릭스가 수천 가지 (단어 단위)로 쉽게 수백만 개 (예 : 짹짹)가 될 수있는 상황 유형을 상상합니다. 나는 시도하지 않았지만 그 경우에 밀도가 높은 것으로 변환하는 것이 결코 큰 변화가 아닐 것이라고 생각합니다. –