以下代码挂起,
while np.any((np.log10((O3 / HB)) < 0.61 / (np.log10(N2 / HA) - 0.05) + 1.3).any()):
plt.plot(np.array(np.log10(N2 / HA)), np.array(np.log10(O3 / HB)), '.g')
plt.plot(np.array(np.log10(N2 / HA)), np.array(np.log10(O3 / HB)), '.r')
情节没有&#34;而#34;条件。在上面的形式它挂起。 我是否需要&#34;休息&#34;?
感谢
答案 0 :(得分:0)
代码可能会冻结,因为每次循环迭代时你都会创建一个新的绘图对象,最终你会耗尽内存。该程序通常会在20个左右的图表后发出警告。
您可以每次清除轴作为替代,或
When to use cla(), clf() or close() for clearing a plot in matplotlib?
或者您可以使用.set_xdata
,set_ydata
命令来简单地更新数据。或者,如果要覆盖数据,则可以重复使用相同的轴。
答案 1 :(得分:0)
代码冻结是因为您正在使用while
循环,其条件的变量在循环内不会发生变化。因此,如果条件在第一次循环时评估为True
,则它将无限期地评估为True
(即代码“挂起”#39;)。通常(除非您希望循环永久运行)while
循环中的一个或多个变量将在循环内发生变化。一个非常简单的例子是,
while index < 10:
plt.plot(x_data[index], y_data[index])
index += 1 # Here the index changes.
注意:出于这些目的,更常见的是使用for index in range(10):
或更好for xd, yd in zip(x_data, y_data): plt.plot(xd, yd)
而不是while
循环,因为那样你就不会需要有index += 1
行,并且在循环开始时它会更清楚。我只是将此作为while
的明确示例使用。
即使条件变量确实在循环内发生了变化(即如果你只提供了while
循环的片段),条件语句总是可以计算为True
。在这种情况下,再次,您永远不会退出while
循环,您的代码将会“挂起”。
根据您的目的,您可以采用多种方法解决问题:
如果您只想绘制一次数据,请使用if
代替while
。
如果你只是向我们展示你的循环片段,并且条件语句中的变量在循环中发生变化,我建议:
A)首先在循环顶部放置print(np.any((np.log10((O3 / HB)) < 0.61 / (np.log10(N2 / HA) - 0.05) + 1.3).any()))
并运行代码。我认为这会将True
转储到您的控制台。
B)然后,您可以使用更多的打印语句(例如print('N2: %f' % N2)
)来区分此语句,以了解为什么您的语句永远不会评估False
,因此您永远不会退出循环。