我想读取“n”目录/数据文件,从每个目录读取7列,然后检查n *(n-1)“if”语句是否正确使用前面读取的7列中的一些。如果条件成立,那么做一些数学计算,否则不要做任何事情。例如,如果我比较两个目录,那么我有2个“if”语句来测试,如果我有3个目录,那么我有6个“if”语句来检查。整洁的方式来编写几个嵌套for循环和if语句在python中。
每个目录有大约10,000行和大约40列,但它们的长度通常彼此不同。
目前,我有3个目录的工作代码,其中我将三个目录作为嵌套for循环读取并应用我的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,3,4个令人讨厌的目录,我必须编辑代码。
- 2个目录匹配最多需要33分钟才能执行,但3个目录匹配代码目前已运行2天。有什么办法可以加快速度。
对于第一个问题,我在下面给出的链接中查找递归函数,但是我的问题是我可以使用这个,因为我要检查的条件数也取决于“n”并且列名通常不是在整个目录中是同质的例如:一个目录可能将右升为'RA',另一个目录可能将其称为'ra'或'右升上'。
对于第二个问题,我试图用多处理文档以下。
https://docs.python.org/2/library/multiprocessing.html
我想知道这是否是更好地坚持以嵌套的for循环,如果我想要做的多处理或尝试使用递归函数。任何意见,将不胜感激。