python - 改进 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'' 无法安全地将输入强制转换为任何支持的类型
有人可以帮助我以连贯的方式重新制定循环,也许还可以加快它的速度吗?
解决方案
首先,考虑使用 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):
推荐阅读
- javascript - 由于现在已禁用视口更改,如何使用 javascript 强制视口“取消缩放”?
- php - 使用 php 长时间保持 http 连接?
- docker - 如何在 docker 环境中解决 gradle 被破坏的问题?
- python - cv2.imshow() 函数在我调用它时不显示任何内容
- python - 每次 Python 都给我 True
- r - 是否有任何 r 代码可以使用带有 ggplot 的 facet wrap 来关闭直方图中的所有间隙?
- django - 生产中的静态文件 404
- android - 如何创建仅包含图标的芯片?
- android - 使用服务帐户从android更新谷歌表?
- excel - Excel ComboBox - 键入的文本在组合框失去焦点之前不显示