【问题标题】:Improving loop over 4 variables改进 4 个变量的循环
【发布时间】:2021-09-21 08:33:58
【问题描述】:

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

现在我想在一个文件上打印实例的类 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'' 无法安全地将输入强制转换为任何支持的类型

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

【问题讨论】:

  • 不应该是if x == data.par_lambda and y == data.par_alpha and z == data.l0:吗?

标签: python python-3.x for-loop save


【解决方案1】:

首先,考虑使用 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 建议的那样,您可能希望将其更改为 andand 运算符的优先级低于 ==,因此将首先评估 ==。尽管如此,使用括号仍然是个好习惯!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多