2016-10-09 27 views
1

我想读取“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) 

       ): 

我有与此相关的两个问题:

  1. 我想概括这个任意数量的目录。目前,如果我有2,3,4个令人讨厌的目录,我必须编辑代码。
  2. 2个目录匹配最多需要33分钟才能执行,但3个目录匹配代码目前已运行2天。有什么办法可以加快速度。

对于第一个问题,我在下面给出的链接中查找递归函数,但是我的问题是我可以使用这个,因为我要检查的条件数也取决于“n”并且列名通常不是在整个目录中是同质的例如:一个目录可能将右升为'RA',另一个目录可能将其称为'ra'或'右升上'。

Basics of recursion in Python

对于第二个问题,我试图用多处理文档以下。

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

我想知道这是否是更好地坚持以嵌套的for循环,如果我想要做的多处理或尝试使用递归函数。任何意见,将不胜感激。

回答

1

查找itertools包。这将为您提供一些基本工具来遍历列列表,并将列表长度指定为参数。是的,递归有助于解决组合问题,但是此包将为您处理递归开销。

你想为这个应用程序的特定概念是组合的7列,一次取ñ。为了说明方便,我们考虑7列,每次取3个:共有35个组合:7 * 6 * 5/3 * 2 * 1

您将获得的是一个生成器,a函数,按照整理顺序,每次返回35个组合中的每一个。然后你可以像遍历列表一样遍历它。对于每个组合,遍历成对的列:

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 

这是过程的基本概述。你能从这里拿走吗?