2016-10-09 4 views
1

"n"個のカタログ/データファイルを読み込もうとしているときに、各カタログから7個の列を読み込み、先に読み込まれた7個の列のうちのいくつかを使ってn *(n-1)条件が真であれば、数学を行い、そうでなければ何もしない。Pythonでいくつかのネストされたforループとif文を記述する方法。

たとえば、2つのカタログを比較している場合、テストする2つのif文があり、3つのカタログがある場合は、6つのif文でチェックします。

各カタログは約10,000行、約40列ですが、長さは一般に異なります。

現在、3つのカタログの作業コードを用意しています.3つのカタログをループ用にネストし、6つの条件を適用します。

  1. 私はカタログの任意の数にこれを一般化したいと思います:

    path="xx" #Location of all input files. 
    cat1 = ascii.read(path + file3, guess=False) 
    data2 = fits.getdata(path+file2, 1) 
    cat2 = Table(data2) 
    cat3 = Table.read(path + 'xyz.tbl', format='ipac') 
    
    
    
    
    for i in range(len(cat1)): 
        (ra1,dec1,flux1,flux1error,maj1,minor1,ang1)= (cat1['RA_Degrees'][i], 
    cat1['DEC_Degrees'][i],cat1['fitted_total_flux'][i], 
    cat1['fitted_total_flux_error'][i],cat1['BMajor_Degrees'][i], 
    cat1['BMinor_Degrees'][i],cat1['position_angle_deg'][i]) 
        ang1=ang1*np.pi/180 
    
    
    
        for j in range(len(cat2)): 
         (ra2,dec2,total_cat2,total_error_cat2,maj2,min2,pa2)= (cat2['ra'][j],cat2['dec'][j], 
         cat2['total'][j],cat2['total_err'][j], 
         cat2['BMajor'][j],cat2['Bminor'][j],cat2['Position Angle'][j] 
    
    
         for k in range(len(cat3)): 
          (ra3,dec3,total_cat2,total_error_cat2,maj3,min3,pa3)=(cat3['ra'][k], 
          cat3['dec'][k],cat3['flux'][k],cat3['ferr'][k],cat3['bmaj'][k], 
          cat3['bmin'][k],cat3['pa'][k]) 
    
          if np.all(
    
          np.all(np.abs(ra2-ra1)< maj1+ maj2 and 
    
          np.all(np.abs(dec2-dec1)< maj1 + maj2) and 
    
          np.all(np.abs(ra3-ra2)< maj2 + maj3) and 
    
          np.all(np.abs(dec3-dec2)< maj2 + maj3) and 
    
          np.all(np.abs(ra3-ra1)< maj1 + maj3) and 
    
          np.all(np.abs(dec3-dec1)< maj1 + maj3) 
    
           ): 
    

    私はこれに関連する2つの問題を抱えている:ここでは

    は、私のコードの例です。現在、2,3,4個のカタログが煩わしい場合は、コードを編集する必要があります。
  2. 2件のカタログの一致には33分かかりますが、3件のカタログ一致コードは現在2日間実行されています。これをスピードアップする方法はありますか?

最初の問題については、私は以下のリンクで再帰関数を参照しましたが、私の条件の数は "n"にも依存し、一般的にはカタログ間で均質である。たとえば、1つのカタログがRight Ascensionを 'RA'と呼び、別のカタログが 'ra'または 'Right Ascension'と呼びます。第二の問題については

Basics of recursion in Python

、私は、ドキュメント、次のマルチプロセッシングを使用しようとしていました。

https://docs.python.org/2/library/multiprocessing.html

私は私がマルチ処理を行うか、再帰関数を使用しようとする場合、ループの入れ子にするために固執する方が良いかどうかを知りたいと思いました。アドバイスをいただければ幸いです。

答えて

1

itertoolsパッケージを参照してください。これは、リストの長さをパラメーターとして指定して、列のリストを反復するための基本的なツールを提供します。はい、再帰は組み合わせを解決するのに役立ちますが、このパッケージは再帰オーバーヘッドを処理します。

あなたはこのアプリケーションのためにしたい特定の概念は、一度にNを取られ、7列の組み合わせです。 7 * 6 * 5/3 * 2 * 1

の生成元はです。 35個の組み合わせのそれぞれを照合順に1つずつ返す関数です。あたかもそれがリストであるかのようにそれを反復することができます。各組み合わせについて、列のペアを反復します。

for col_list in combo_gen: 
    for right in range (1, n): 
     r_col = col_list[right] 
     for left in range(right): 
      l_col = col_list[left] 
      # Compare l_col and r_col 

これはプロセスの基本的な概要です。ここから取り出せますか?

関連する問題