2012-11-29 5 views
1

대칭 끝에있는 사용자 정의 h5py 배열을 만드는 방법을 찾고있었습니다. 이상적으로 배열이 만들어 질 때 a[i][j]a[j][i]이 가리키는 단일 값을 가지게됩니다. 그 이유는 제가 원거리 벡터를 사각형 형태의 행렬에 쓰려고하기 때문입니다. 벡터와 정사각형 행렬은 너무 커서 메모리에 저장할 수 없으므로 정사각형 행렬을 만드는 비교적 빠른 솔루션을 원합니다.포인터를 사용하는 h5py 대칭 배열

답변

1

여분의 논리를 사용하여 1D 배열을 사용하여 행렬의 위쪽 삼각형을 저장하는 것이 좋습니다. 당신이로하는 기능을 쓸 수

[[0 1 2 3 ] 
[x 4 5 6 ] 
[x x 7 8 ] 
[x x x 9 ]] 

:

from __future__ import division 
def tri_ravel_factory(n_cols): 
    def tri_ravel(j, k): 
     assert j < n_cols, 'j out of range' 
     assert k < n_cols, 'j out of range' 
     assert j >= 0, 'j out of range' 
     assert k >= 0, 'j out of range'   
     if k < j: 
      j, k = k, j 
     #return sum(n_cols - tmp for tmp in range(0, j)) + (k - j) 
     return j * n_cols - (j * (j-1))//2 + (k-j) 
    return tri_ravel 


test_ravel = tri_ravel_factory(4) 
indx = test_ravel(1, 0)  

이는 당신에게 2 배를 얻을 수> 2D 배열이 같은 매핑 - < 1 차원 배열의 인덱스를지도 . 스파 스 배열을 사용하여 필요한 거리를 계산하거나 거리의 대부분을 계산할 필요가없는 방법을 찾는 것이 좋습니다 (예 : distance < r과 쌍을 맺는 것처럼).

+0

원래 계획했던 것이지만 결국에는 각 행을 정렬 할 수 있기를 원했습니다. 양측이 있으면 특정 행을 정렬하기 위해 더 낮은 삼각형에 대한 값을 추출하는 추가 논리를 갖는 것이 훨씬 쉽습니다. – biophetik

+0

@biophetik이 모든 작업을 포기 했습니까? 이 논리를 데이터와 함께 클래스에서 랩핑 한 다음 정렬을 매우 쉽게 할 수있는 인터페이스를 노출 할 수 있습니다. – tacaswell

+0

예 실제로 방금이 문제를 완전히 제거하기 위해 방법론을 전환했습니다. 그러나 여전히 관심이 있습니다. 배열의 미러링을 포함하는 h5py 배열에서 새로운 클래스를 작성한 기사를 읽은 것을 기억합니다. 본질적으로이 값은 행렬의 상반부와 상응하는 하반부에 대한 값을 가리 켰습니다. 그래도 나는 다시 그 자리를 찾지 못했을 것입니다. 아마도 그것은 꿈이었을 것입니다. – biophetik

관련 문제