用itertools代替嵌套列表

高维参数处理

需求

高维参数化的分析,比如模拟一个体系,体系的长宽比在变,热源宽度在变,特征尺寸也在变。利用pandas和itertools可以对这类问题进行快速整洁的数据处理。

一个小例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from itertools import product

import pandas as pd

parameters = [
[0.01, 0.005],
[1, 2],
[1e-9, 1e-8]
]
meshgrid_parameters = list(product(*parameters))
parameter_names = ['wg', 'w', 'l']

data = pd.DataFrame(columns=[parameter_names], data=meshgrid_parameters)

def func(wg, w, l):
return wg * w * l

for i, (wg, w, l) in enumerate(meshgrid_parameters):
data.loc[i, 'product'] = func(wg, w, l)

print(data.to_markdown())
('wg',) ('w',) ('l',) ('product',)
0 0.01 1 1e-09 1e-11
1 0.01 1 1e-08 1e-10
2 0.01 2 1e-09 2e-11
3 0.01 2 1e-08 2e-10
4 0.005 1 1e-09 5e-12
5 0.005 1 1e-08 5e-11
6 0.005 2 1e-09 1e-11
7 0.005 2 1e-08 1e-10

这里parameters就是要参数化分析的参数列表,parameter_names是这些参数对应的名字;itertools.product将它们两两组合,返回一个生成器;func是一个说明性的函数,假如要用这些参数计算某些物理量,可以用这样的方式来生成新的特征列。想要选取某个参数为特定值的各量的值,利用pandas提供的布尔索引即可:

1
data.loc[(data['wg']==0.01).values]
('wg',) ('w',) ('l',) ('product',)
0 0.01 1 1e-09 1e-11
1 0.01 1 1e-08 1e-10
2 0.01 2 1e-09 2e-11
3 0.01 2 1e-08 2e-10