2017-12-05 10 views
0

私の仕事は、銀河の大きなリストから一緒に近い銀河をペアにすることです。私はそれぞれのRA、DEC、Zと、与えられたデータからそれぞれの距離を計算する式を持っています。しかし、私は、各銀河とそれに最も近い隣の銀河とを一致させるという目的で、リスト内の各銀河と他のすべての銀河との距離を見つけるための効率的な方法を試すことはできません。データ中のすべての銀河間の最も近い距離を見つけ、それらの間の最も近い距離に基づいてペアを作成します。

データは次のようにインポートされている:最初に、実際に行い、すべての銀河、間RAおよび12月の違いをうまくする

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

:私はのようなものを試してみました

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'] 

私は良い方法がなければならないように感じる。

友人はの線に沿って何か提案:

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/ja/stable/coordinates/matchsep.html#astropy-coordinates-matching)があなたの用途であるかどうかを調べましたか?カタログにマッチすることができます(自動的にペアを作成するわけではありません)。これは、フードの下でscipyのkdツリーを使用します。 – Evert

+0

この最初のフェーズで私を助けてくれるのかどうかは分かりませんが、次のギャラクシーペアの分離線に基づいて新しい座標系に変更する必要がある場合は、非常に役に立ちます。 – enceledus

答えて

0

友人のコードは、(距離(x、y)の各対の間の距離の2次元配列を生成し、対称性を利用しているように見える=距離(y、x))。組み合わせを生成するのにitertoolsを使用した方が若干良いでしょうし、i、jとjの両方に対して別々の繰り返しを行うのではなく、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]から銀河[j]までの距離が銀河[j]から銀河[i]までの距離と同じであることを知っているので、これはあなたに必要なすべてのペアを与えます。 – Acccumulation

+0

素晴らしい、ありがとう! – enceledus

関連する問題