如何向itertools.product动态传入任意列参数实现通用全因子矩阵生成
解决方案
核心方法:使用Python位置参数解包语法
你只需要用*解包运算符,将二维数组X的每一行作为独立参数传入itertools.product即可,完全不需要拼接字符串和eval,修改后的代码如下:
import itertools import numpy as np # 前面的变量定义逻辑保持不变 input_list = dfraw.columns[0:n_inputs] output_list = dfraw.columns[n_inputs:len(dfraw.columns)] fflvls = 4 lhspoints = 60000 X = np.zeros((n_inputs, fflvls),float) for ii, entrada in enumerate(input_list): X[ii] = np.linspace(min(dfraw[entrada]), max(dfraw[entrada]), fflvls) X_fact = np.zeros((int(fflvls**n_inputs), n_inputs), float) # 仅修改循环行,用*X解包所有行作为product的参数 for i, combination in enumerate(itertools.product(*X)): X_fact[i,:] = combination
额外优化:纯numpy实现(性能更高)
如果你的输入变量数和因子水平不算特别大,用numpy原生的meshgrid可以避免Python层循环,速度提升明显:
grid = np.meshgrid(*X, indexing='ij') X_fact = np.column_stack([g.ravel() for g in grid])
原eval方案失效的原因
你之前的写法有两个问题:
- 字符串拼接逻辑重复,初始加了
X[0,:],循环又从0开始加了一遍所有索引的参数,导致参数列表重复 eval(in_products)返回的是单个值,相当于给product只传了1个参数,自然无法得到预期的全组合结果
内容的提问来源于stack exchange,提问作者sohkahtoa
相关产品推荐
相关产品推荐

