首页 > 解决方案 > 改进 4 个变量的循环

问题描述

我正在尝试执行以下循环:
我有三个数组:
l、val_lambda、val_alpha,每个数组包含 10 个值和一个数据集,一个包含 1000 个类结果的列表,即 dataset[i] = traj_analysis(dt, X, Y , x, y, z) 表示 l, val_lambda, val_alpha 中的 x, y, z。

现在我想在文件上打印类 traj_analysis 的实例结果之一 - 对文件夹有一定的关注。这是我写的:

the_vals = [(x, y, z) for x in val_lambda for y in val_alpha for z in l]
for (x, y, z) in tqdm(the_vals):
    for data in datasets:
        if x == data.par_lambda & y == data.par_alpha & z == data.l0:
            filename_msd = './simulation/lamda =' +str(f'{x:.2f}')+'/ alpha ='+str(f'{y:.2f}')+'/cargo/l0='+str(f'{z:.2f}')+'/cargo_msd.csv'
            os.makedirs(os.path.dirname(filename_msd), exist_ok=True)
            np.savetxt(filename_msd, data.msd, delimiter=',')

不幸的是,我收到了这个错误:

输入类型不支持 ufunc 'bitwise_and',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

有人可以帮助我以连贯的方式重新制定循环,也许还可以加快它的速度吗?

标签: pythonpython-3.xfor-loopsave

解决方案


首先,考虑使用 zip 代替,

for (x, y, z) in tqdm(zip(val_lambda, val_alpha, l)):

其次,问题可能出在您的if陈述逻辑中。

这是因为&优先级高于==,因此在您的陈述中,它可能被评估为:

if x == (data.par_lambda & y) == (data.par_alpha & z) == data.l0:

解决方法是将适当的支架放在适当的位置:

if (x == data.par_lambda) & (y == data.par_alpha) & (z == data.l0):

只是补充一点,&它更常用于按位运算,因此,正如 fferri 建议的那样,您可能希望将其更改为and。运算符的and优先级低于==,因此==将首先评估。尽管如此,使用括号仍然是一个好习惯!

if (x == data.par_lambda) and (y == data.par_alpha) and (z == data.l0):

推荐阅读