2012-12-21 5 views
0

질문은 매우 간단합니다. scipy 스파 스 매트릭스 M (100,000X500,000)에서 주어진 행 r이 있다고 가정 해 봅시다. M 매트릭스에서 위치/인덱스를 찾고 싶습니까? 효율적인 방법으로이를 어떻게 수행 할 수 있습니까?scipy 스파 스 매트릭스에서 주어진 행을 찾으십니까?

현재 다음과 같은 방법을 시도하고 있지만 끔찍하게 느립니다. 하나 개 이상의 스파 스 매트릭스 타입의 내부로 파고 싶어하지 않는

offset = 500 
begin = 0 
end = begin + offset 
row = row.todense() #convert sparse to dense 
while 1: 
    sub_M = M[begin:end,:].todense() #M matrix is too big that its dense cannot fit memory 
    labels=np.all(row == sub_M, axis=1) # here we find row in the sub set of M, but in a dense representation 
    begin = end 
    end = end + offset 
    if (end - offset) == M.shape[0]: 
     break 
    elif end > M.shape[0]: 
     end = M.shape[0] 

답변

1

, 당신은 당신의 행렬 CSR 형식을 사용한다 :

  • 각 행렬 행의 길이 (L2 규범을) 계산 ; 다른 말로 : sum(multiply(M, M), 2)
  • 정규화 R (L2)의 길이 1
  • 행렬 곱 M*r의 엔트리는 대응하는 행의 길이와 일치하면

(R은 열 벡터로서 취급한다) M*r , 그러면 당신은 성냥을가집니다.

numpy.linalg.norm의 기본값 ord은 L2 표준입니다.

+0

위대한 팁 주셔서 감사합니다. 내 데이터를 규범화하려하지만 ValueError : dimension mismatch가 계속 발생합니다. 조언 있니? – TsendeeMTS

+0

CSR 행 벡터를 밀도가 높은 형식으로 변환하면 작동합니다. – TsendeeMTS

+0

@TsendeeMTS 함께 곱셈되고있는 오브젝트의'.shape()'를 확인하십시오. 또한 어떤 작업을 통해 오류가 발생했는지 알려주십시오. – jrennie

0

마지막으로, 매우 간단하지만 많은 시간 효율적인 해결책을 찾았습니다. 스파 스 행렬의 각 행은 문자열로 변환되어 색인/위치와 함께 사전에 저장됩니다. 그런 다음 행을 찾을 필요가 사전의 핵심이고 dic [str (row)]이 나에게 색인을 제공합니다.

관련 문제