在 python 中编写多个嵌套 for 循环和 if 语句的巧妙方法。
Neat way to write several nested for loops and if statements in python.
我正在尝试读取 "n" 目录/数据文件,从每个目录中读取 7 列,然后使用 7 中的一些检查 n*(n-1) "if" 语句是否正确专栏阅读较早。如果条件为真,则进行一些计算,否则什么都不做。
例如,如果我比较两个目录,那么我有 2 个 "if" 语句要测试,如果我有 3 个目录,那么我有 6 个 "if" 语句要检查。
每个目录大约有 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 天了。有什么办法可以加快速度吗?
对于第一个问题,我在下面给出的 link 中查找了递归函数,但我的问题是我可以使用它吗,因为我要检查的条件数也取决于 "n" 和列名在目录中通常不是同质的。例如:一个目录可能称正经为 'RA',另一个目录可能称其为 'ra' 或 'Right Ascension'.
对于第二个问题,我尝试按照文档使用多处理。
https://docs.python.org/2/library/multiprocessing.html
我想知道如果我想进行多重处理还是使用递归函数,是坚持嵌套循环更好。任何意见,将不胜感激。
查找 itertools 包。这将为您提供一些基本工具来遍历列列表,并将列表长度指定为参数。是的,递归有助于解决组合数学问题,但此包将为您处理递归开销。
您希望此应用程序的特定概念是 7 列的组合,一次取 n。为了便于说明,让我们考虑 7 列,一次取 3 列:总共 35 种组合:7*6*5 / 3*2*1
您将得到一个 生成器 ,该函数将 return 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
这是流程的基本概要。你能从这里拿走吗?
我正在尝试读取 "n" 目录/数据文件,从每个目录中读取 7 列,然后使用 7 中的一些检查 n*(n-1) "if" 语句是否正确专栏阅读较早。如果条件为真,则进行一些计算,否则什么都不做。
例如,如果我比较两个目录,那么我有 2 个 "if" 语句要测试,如果我有 3 个目录,那么我有 6 个 "if" 语句要检查。
每个目录大约有 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 天了。有什么办法可以加快速度吗?
对于第一个问题,我在下面给出的 link 中查找了递归函数,但我的问题是我可以使用它吗,因为我要检查的条件数也取决于 "n" 和列名在目录中通常不是同质的。例如:一个目录可能称正经为 'RA',另一个目录可能称其为 'ra' 或 'Right Ascension'.
对于第二个问题,我尝试按照文档使用多处理。
https://docs.python.org/2/library/multiprocessing.html
我想知道如果我想进行多重处理还是使用递归函数,是坚持嵌套循环更好。任何意见,将不胜感激。
查找 itertools 包。这将为您提供一些基本工具来遍历列列表,并将列表长度指定为参数。是的,递归有助于解决组合数学问题,但此包将为您处理递归开销。
您希望此应用程序的特定概念是 7 列的组合,一次取 n。为了便于说明,让我们考虑 7 列,一次取 3 列:总共 35 种组合:7*6*5 / 3*2*1
您将得到一个 生成器 ,该函数将 return 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
这是流程的基本概要。你能从这里拿走吗?