8

NumPy と SciPy を使用して Python で実行されているシミュレーション モデルがあり、各反復の出力として 2D NumPy 配列が生成されます。matplotlib と imshow 関数を使用して、この出力を画像として表示しています。しかし、私はGlumpyについて知り、そのドキュメントページには次のように書かれています:

IPython シェルのおかげで、glumpy はインタラクティブ モードで実行でき、表示された配列の内容が変更されたときにライブ更新を体験できます。

しかし、私は彼らが与えた例でこれを行う方法を理解できないようです. 基本的に、私のモデルは、実行中の反復回数だけループする大きな for ループを持つ単一の関数として実行されます。for ループの各反復の最後に、配列を表示したいと考えています。現時点では、matplotlib を使用して画面に表示すると python プロセスがフリーズするように見えるため、matplotlib を使用して画像を png ファイルに保存しています。

Glumpyでこれを行う方法があると確信しています.方法がわからないだけで、有用なチュートリアルが見つかりません.

4

2 に答える 2

11

Glumpy のドキュメントはほとんど存在しません。glumpy以下は、配列の視覚化をと比較する簡単なシミュレーションの例ですmatplotlib

import numpy as np
import glumpy
from OpenGL import GLUT as glut
from time import time
from matplotlib.pyplot import subplots,close
from matplotlib import cm

def randomwalk(dims=(256,256),n=3,sigma=10,alpha=0.95,seed=1):
    """ A simple random walk with memory """
    M = np.zeros(dims,dtype=np.float32)
    r,c = dims
    gen = np.random.RandomState(seed)
    pos = gen.rand(2,n)*((r,),(c,))
    old_delta = gen.randn(2,n)*sigma
    while 1:
        delta = (1.-alpha)*gen.randn(2,n)*sigma + alpha*old_delta
        pos += delta
        for ri,ci in pos.T:
            if not (0. <= ri < r) : ri = abs(ri % r)
            if not (0. <= ci < c) : ci = abs(ci % c)
            M[ri,ci] += 1
        old_delta = delta
        yield M

def mplrun(niter=1000):
    """ Visualise the simulation using matplotlib, using blit for 
    improved speed"""
    fig,ax = subplots(1,1)
    rw = randomwalk()
    im = ax.imshow(rw.next(),interpolation='nearest',cmap=cm.hot,animated=True)
    fig.canvas.draw()
    background = fig.canvas.copy_from_bbox(ax.bbox) # cache the background

    tic = time()
    for ii in xrange(niter):
        im.set_data(rw.next())          # update the image data
        fig.canvas.restore_region(background)   # restore background
        ax.draw_artist(im)          # redraw the image
        fig.canvas.blit(ax.bbox)        # redraw the axes rectangle

    close(fig)
    print "Matplotlib average FPS: %.2f" %(niter/(time()-tic))

def gprun(niter=1000):
    """ Visualise the same simulation using Glumpy """
    rw = randomwalk()
    M = rw.next()

    # create a glumpy figure
    fig = glumpy.figure((512,512))

    # the Image.data attribute is a referenced copy of M - when M
    # changes, the image data also gets updated
    im = glumpy.image.Image(M,colormap=glumpy.colormap.Hot)

    @fig.event
    def on_draw():
        """ called in the simulation loop, and also when the
        figure is resized """
        fig.clear()
        im.update()
        im.draw( x=0, y=0, z=0, width=fig.width, height=fig.height )

    tic = time()
    for ii in xrange(niter):
        M = rw.next()           # update the array          
        glut.glutMainLoopEvent()    # dispatch queued window events
        on_draw()           # update the image in the back buffer
        glut.glutSwapBuffers()      # swap the buffers so image is displayed

    fig.window.hide()
    print "Glumpy average FPS: %.2f" %(niter/(time()-tic))

if __name__ == "__main__":
    mplrun()
    gprun()

matplotlibwithGTKAggをバックエンドとして使用しblit、毎回背景を描画しないように使用すると、約 95 FPS を達成できます。Glumpy現在、ラップトップのグラフィック設定はかなり貧弱ですが、約 250 ~ 300 FPS が得られます。とは言っても、Glumpy作業を行うには少し手間がかかります。巨大な行列を扱っている場合や、何らかの理由で非常に高いフレームレートが必要な場合を除き、 with を使用することに固執しmatplotlibますblit

于 2013-01-24T04:48:04.350 に答える