2017-12-05 24 views
0

내 임무는 은하계의 큰 목록에서 가장 가까운 은하계를 쌍으로 만드는 것입니다. 나는 각각의 RA, DEC, Z와 주어진 데이터로부터 각각의 거리를 계산하는 수식을 가지고있다. 그러나 각 은하계와 가장 가까운 이웃과의 매칭을 목적으로리스트에서 각 은하계와 다른 모든 은하계 사이의 거리를 찾기 위해 전체리스트를 반복하는 효과적인 방법을 찾을 수는 없습니다.데이터에서 모든 은하 간의 가장 가까운 거리를 찾고 그들 사이의 가장 가까운 거리를 기준으로 쌍을 만듭니다.

이 데이터는 다음과 같은 방법으로 가져온

:

hdulist = fits.open("documents/RADECMASSmatch.fits") 
    CATAID = data['CATAID_1'] 
    Xpos_DEIMOS_1 = data['Xpos_DEIMOS_1'] 
    z = data['Z_1'] 
    RA = data['RA'] 
    DEC = data['DEC'] 

내가 좋아하는 뭔가를 시도 :

radiff = [] 
    for i in range(0,n): 
     for j in range(i+1,n): 
      radiff.append(abs(RA[i]-RA[j])) 

는 처음에 실제로 않는 모든 은하 사이 RA와 12 월의 차이를 해결하기 위해 작동하지만 더 좋은 방법이 있어야하는 것처럼 느껴집니다.

친구

이의 라인을 따라 뭔가 제안 :

galaxy_coords = (data['RA'],data['DEC'],data['Z]) 
    separation_matrix = np.zeros((len(galaxy_coords),len(galaxy_coords)) 

    done = [] 
    for i, coords1 in enumerate(galaxy_coords): 
      for j, coords2 in enumerate(galaxy_coords): 
       if (j,i) in done: 
        separation_matrix[i,j] += separation matrix[j,i] 
        continue 
        separation = your_formula(coords1, coords2) 
        separation_matrix[i,j] += separation 
        done.append((i,j)) 

을하지만 난 정말 쉽게 적용 할 수 있도록이 이해가 안 돼요. 나는 시도했지만 유용성이 전혀 없다.

이에 어떤 도움이 더 이해 될 것이다 덕분

+0

['astropy.coordinates'] (http://docs.astropy.org/en/stable/coordinates/matchsep.html#astropy-coordinates-matching)가 어떤 용도로 사용되었는지 보셨습니까? 카탈로그와 일치 할 수 있지만 (자동으로 쌍을 생성하지는 않습니다). 그것은 scipy의 kd-tree를 사용합니다. – Evert

+0

이 첫 번째 단계에서 도움이되는지 확신 할 수 없지만 다음은 각 은하계 쌍의 분리 선을 기반으로 새로운 좌표계로 변경해야하는 경우에 매우 유용 할 것 같습니다. – enceledus

답변

0
친구의 코드는 각각의 쌍 사이의 거리의 2 차원 배열을 생성하고) 거리 (X, Y (대칭성을 이용하는 것으로 보인다

= 거리 (y, x)). itertools를 사용하여 조합을 생성하고 i, j 및 j, i에 대해 별도의 반복을 수행하는 대신 동일한 반복 내에서 your_formula(coords1, coords2)separation_matrix[i,j]separation_matrix[j,i]에 할당하면 약간 더 좋을 것입니다.

트리 기반 알고리즘을 사용하는이 패키지가 더 좋을 수도 있습니다 : https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree.html. 그것은 직선 좌표에 초점을 맞추고있는 것처럼 보이지만 선형 시간으로 처리 할 수 ​​있어야합니다.

+0

나를 보여줄 수 있습니까? 너 무슨 뜻이야? 나는 itertools와 반복적 인 코딩에 지나치게 익숙하지 않다. 감사합니다. – enceledus

+0

'itertools.combinations (len (galaxy_coords), 2)'를 실행하면 0에서 len (galaxy_coords) -1 사이의 모든 고유 한 인덱스 쌍을 얻을 수 있습니다. 그것은 당신에게 쌍 (i, i)의 쌍을주지 않을 것이고, 그것이 당신에게 (i, j)를 준다면 그것은 당신에게 (j, i)를주지 않을 것입니다. 여러분은 어떤 것과의 거리가 제로이고 갤럭시 [i]에서 은하계까지의 거리가 은하계와 은하계까지의 거리와 같기 때문에 필요한 모든 쌍을 얻을 수 있습니다 . – Acccumulation

+0

훌륭해, 고마워! – enceledus