将 2D 网格搜索代码扩展和优化到 N 维(使用 itertools)
Extending and optimizing 2D grid search code to N-dimensions (using itertools)
我有二维网格搜索的代码,它运行得很好。这是示例代码:
chinp = np.zeros((N,N))
O_M_De = []
for x,y in list(((x,y) for x in range(len(omega_M)) for y in range(len(omega_D)))):
Omin = omega_M[x]
Odin = omega_D[y]
print(Omin, Odin)
chi = np.sum((dist_data - dist_theo)**2/(chi_err))
chinp[y,x] = chi
chi_values1.append(chi)
O_M_De.append((x,y))
我的问题是,在未来的某个时候,我可能想要在更多维度上执行网格搜索。现在,如果这是 3 维的情况,那么就像在我的 'for' 语句(第 3 行)中添加另一个变量 'z' 一样简单。这段代码对我来说也可以很好地继续添加更多维度(我已经尝试过并且有效)。
然而,如您所知,如果我想要对大量维度执行网格搜索,继续向我的 'for' 语句添加变量(例如,对于 5D它会像 'for v,w,x,y,z in list(((v,w,x,y,z)...').
仅通过各种 google 搜索,我的印象是 itertools 在执行网格搜索时非常有帮助,但是我对编程还很陌生,不熟悉它。
我的问题是是否有人知道一种方法(使用 itertools 或我不知道的其他方法)能够以更有效的方式将此代码扩展到 N 维(即可能更改 'for' 语句,这样我就可以轻松地对 N 维进行网格搜索,而无需添加另一个 'for z in range etc'
预先感谢您的帮助。
你想看一看product function from itertools
import itertools
x_list = [0, 1, 2]
y_list = [10, 11, 12]
z_list = [20, 21, 22]
for x, y, z in itertools.product(x_list, y_list, z_list):
print(x, y, z)
0 10 20
0 10 21
0 10 22
0 11 20
0 11 21
(...)
2 11 21
2 11 22
2 12 20
2 12 21
2 12 22
请注意,这不是最有效的方法。如果添加一些矢量化(例如使用 numpy 或 numba)和并行性(使用 multiprocessing 或 numba),您将获得最佳结果。
我有二维网格搜索的代码,它运行得很好。这是示例代码:
chinp = np.zeros((N,N))
O_M_De = []
for x,y in list(((x,y) for x in range(len(omega_M)) for y in range(len(omega_D)))):
Omin = omega_M[x]
Odin = omega_D[y]
print(Omin, Odin)
chi = np.sum((dist_data - dist_theo)**2/(chi_err))
chinp[y,x] = chi
chi_values1.append(chi)
O_M_De.append((x,y))
我的问题是,在未来的某个时候,我可能想要在更多维度上执行网格搜索。现在,如果这是 3 维的情况,那么就像在我的 'for' 语句(第 3 行)中添加另一个变量 'z' 一样简单。这段代码对我来说也可以很好地继续添加更多维度(我已经尝试过并且有效)。
然而,如您所知,如果我想要对大量维度执行网格搜索,继续向我的 'for' 语句添加变量(例如,对于 5D它会像 'for v,w,x,y,z in list(((v,w,x,y,z)...').
仅通过各种 google 搜索,我的印象是 itertools 在执行网格搜索时非常有帮助,但是我对编程还很陌生,不熟悉它。
我的问题是是否有人知道一种方法(使用 itertools 或我不知道的其他方法)能够以更有效的方式将此代码扩展到 N 维(即可能更改 'for' 语句,这样我就可以轻松地对 N 维进行网格搜索,而无需添加另一个 'for z in range etc'
预先感谢您的帮助。
你想看一看product function from itertools
import itertools
x_list = [0, 1, 2]
y_list = [10, 11, 12]
z_list = [20, 21, 22]
for x, y, z in itertools.product(x_list, y_list, z_list):
print(x, y, z)
0 10 20
0 10 21
0 10 22
0 11 20
0 11 21
(...)
2 11 21
2 11 22
2 12 20
2 12 21
2 12 22
请注意,这不是最有效的方法。如果添加一些矢量化(例如使用 numpy 或 numba)和并行性(使用 multiprocessing 或 numba),您将获得最佳结果。