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()

ループを実行する前に画像を生成することに注意してください。時間を計る部分は関数imshowdraw関数だけです。次のような結果が得られます。 私のデモを実行した結果

この速度低下を回避するにはどうすればよいですか?

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()

2 番目の方法がかなり高速であることがわかります。

于 2012-04-22T23:09:13.720 に答える