2017-04-27 8 views
1

forループの各繰り返しで25個のイメージのグリッドを更新するはずのスクリプトがあります。コードは、本質的に、この(私はそれをシンプルに保つために余分なものを省いています)です:複数のパイロットを効率的に更新

from matplotlib import pyplot as plt 
plt.ion() 
fig, ax = plt.subplots(5,5,figsize=(3,3)) 

for i in range(100): 
    updateImages() 
    for j in range(5): 
     for k in range(5): 
       ax[j,k].imshow(image[j,k]) 
    plt.draw() 
    plt.pause(0.01) 

問題は、それは非常に、非常にゆっくりと走る[なし、それが遅いことupdateImages()ない]ということです。私はこれを行うより効率的な方法があると信じていますが、今まで私は例を見つけることができませんでした。提案が最も高く評価されます!

+1

問題は、_replacing/updating_の代わりにいつも 'imshow'を呼び出すときだけ、プロットのデータポイントを_adding_していることでしょう。そうすれば、たくさんのループの後にたくさんのデータを処理する必要があります。あなたは 'ax'のようなリストに' imshow'の最初の出力を保存し、 'list_of_images [j、k] = imshow(...)'というデータを更新し、 'list_of_images [j、k] .set_data(image [j、k]) '。 – Michael

+0

@Michaelこれはコメントよりも答えのようです。 – ImportanceOfBeingErnest

答えて

2

あなたのプログラムは、あなたが常に置き換える代わりにimshowを呼び出すときにのみ、がプロットにデータポイントを追加していることかもしれないいくつかの時間後に遅く走る理由/彼らはを更新します。最も最近にプロットされた点だけが常に表示されますが、Pythonは多くのループの後で多くのデータを処理しなければならないため、遅くなります。

代わりに、imshowという最初の出力をリストに格納し、更新のデータのみをリストに格納できます。そして反復にわたるループに、単にデータを更新

list_of_images[j,k] = imshow(...) 

:まず、axような同じ「形」でリストlist_of_imagesを作成し、そこに最初の反復の画像を保存

list_of_images[j,k].set_data(image[j,k]) 

このようにして、Pythonが処理しなければならないデータの量は反復回数が増えるほど大きくならず、プログラムは安定していなければなりません。


EDIT(OPによる):この回答に基づいて、私は次のことを試してみました:

from matplotlib import pyplot as plt 
plt.ion() 
fig, ax = plt.subplots(5,5,figsize=(3,3)) 
image_grid = ax.copy() # Maybe there is a less awkward way to do this 

for i in range(100): 
    updateImages() 
    for j in range(5): 
     for k in range(5): 
       image_grid[j,k].set_data(image[j,k]) 
    plt.draw() 
    plt.pause(0.01) 

それは(同じくらい速い単一の画像のように)非常にスムーズに実行されます。ありがとう!

+0

これはうまくいった!ありがとうございました! –

関連する問題