我目前正在保存 2 个数字,每个数字有 10 个基于变量的线图。结果是一个嵌套的 for 循环。该代码效率极其低下,尽管我相信有更好的方法可以做到这一点,但我一直找不到有效的方法。
代码应该是不言自明的,见下文。
fig1, ax1 = plt.subplots()
nml_Stress = [8, 15]
nml_Plots = [[(2, "016"), (7, "032"), (8, "034"), (9, "036"), (10, "039"), (11, "040"), (12, "041"),
(36, "086"), (37, "087"), (51, "118")],
[(13, "042"), (14, "043"), (21, "056"), (22, "057"), (23, "058"), (42, "096"),
(45, "103"), (46, "105"), (47, "107"), (52, "119")]]
for i in range(len(nml_Stress)):
for j in range(len(nml_Plots[i])):
ax1.plot(BP_Dis_All[nml_Plots[i][j][0]], BP_Shear_All[nml_Plots[i][j][0]], label=nml_Plots[i][j][1])
ax1.set_title("{} MPa".format(nml_Stress[i]))
fig1.savefig('FracturePlots/{} MPa.png'.format(nml_Stress[i]))
plt.cla()
为了重现绘图函数,我使用以下内容作为 for 循环:
for i in range(len(nml_Stress)):
for j in range(len(nml_Plots[i])):
print(nml_Plots[i][j][0])
print(nml_Plots[i][j][1])
我已经按照谷歌尝试使用map函数、列表理解和itertools函数,但没有成功。
真正引人注目的是你的循环根本不是Pythonic的。您不需要跟踪索引,
zip
相应的集合,并直接迭代集合
for stress, plot in zip(nml_Stress, nml_Plots):
# unpack values from plot here
for pltx, plty in plot:
bpx, bpy = BP_Dis_All[pltx], BP_Shear_All[pltx]
ax1.plot(bpx, bpy, label=plty)
# use f-strings rather than str.format
ax1.set_title(f"{stress} MPa")
fig1.savefig(f'FracturePlots/{stress} MPa.png', format='png', dpi=300)
plt.cla()
与实际将绘图保存到文件相比,这些优化只是小事一桩。程序花费的大部分时间主要花在渲染数据和写入文件上,除非减少正在使用的数据量,否则无法真正优化。