"n"個のカタログ/データファイルを読み込もうとしているときに、各カタログから7個の列を読み込み、先に読み込まれた7個の列のうちのいくつかを使ってn *(n-1)条件が真であれば、数学を行い、そうでなければ何もしない。Pythonでいくつかのネストされたforループとif文を記述する方法。
たとえば、2つのカタログを比較している場合、テストする2つのif文があり、3つのカタログがある場合は、6つのif文でチェックします。
各カタログは約10,000行、約40列ですが、長さは一般に異なります。
現在、3つのカタログの作業コードを用意しています.3つのカタログをループ用にネストし、6つの条件を適用します。
- 私はカタログの任意の数にこれを一般化したいと思います:
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件のカタログの一致には33分かかりますが、3件のカタログ一致コードは現在2日間実行されています。これをスピードアップする方法はありますか?
最初の問題については、私は以下のリンクで再帰関数を参照しましたが、私の条件の数は "n"にも依存し、一般的にはカタログ間で均質である。たとえば、1つのカタログがRight Ascensionを 'RA'と呼び、別のカタログが 'ra'または 'Right Ascension'と呼びます。第二の問題については
、私は、ドキュメント、次のマルチプロセッシングを使用しようとしていました。
https://docs.python.org/2/library/multiprocessing.html
私は私がマルチ処理を行うか、再帰関数を使用しようとする場合、ループの入れ子にするために固執する方が良いかどうかを知りたいと思いました。アドバイスをいただければ幸いです。