10

我想通过调用imshowfor 循环来显示一个简单的动画。这是我的问题的演示:

import pylab,time
images = [pylab.uniform(0,255,(50,50)) for _ in xrange(40)]
pylab.ion()
timings = []
for img in images:
  tic = time.time()
  pylab.imshow(img)
  pylab.draw()
  toc = time.time()
  timings.append(toc-tic)
pylab.clf()
pylab.plot(timings)
pylab.title('elapsed time per iteration')
pylab.ioff()
pylab.show()

请注意,我在运行循环之前生成图像,并且我唯一需要时间的部分是imshowanddraw函数。我得到的结果如下所示: 运行我的演示的结果

我怎样才能避免这种减速?

4

1 回答 1

18

事情正在放缓,因为您每次都添加越来越多的图像并绘制它们。

要么 1)清除每个图像之间的情节(在你的情况下,pylab.cla()),或者更好 2)不要制作新图像,只需将现有图像的数据设置为新数据。

作为使用示例cla()

import matplotlib.pyplot as plt
import numpy as np

images = np.random.uniform(0, 255, size=(40, 50, 50))

fig, ax = plt.subplots()

fig.show()
for image in images:
    ax.imshow(image)
    fig.canvas.draw()
    ax.cla()

作为仅设置数据的示例:

import matplotlib.pyplot as plt
import numpy as np

images = np.random.uniform(0, 255, size=(40, 50, 50))

fig, ax = plt.subplots()

im = ax.imshow(images[0])
fig.show()
for image in images[1:]:
    im.set_data(image)
    fig.canvas.draw()

您会注意到第二种方法要快得多。

于 2012-04-22T23:09:13.720 回答