2010-10-15 38 views
8

Tôi đã có một mô hình mô phỏng chạy bằng Python sử dụng NumPy và SciPy và nó tạo ra một mảng 2D NumPy làm đầu ra mỗi lần lặp. Tôi đã hiển thị đầu ra này như một hình ảnh bằng cách sử dụng matplotlib và hàm imshow. Tuy nhiên, tôi đã tìm hiểu về Glumpy, và trên trang tài liệu của nó, nó nói:Hiển thị mảng NumPy như liên tục cập nhật hình ảnh với Glumpy

Nhờ vỏ IPython, glumpy có thể chạy trong chế độ tương tác, nơi bạn có thể trải nghiệm cập nhật trực tiếp trong mảng hiển thị khi nội dung của chúng được thay đổi .

Tuy nhiên, tôi dường như không thể tìm ra cách thực hiện điều này bằng các ví dụ mà họ đã đưa ra. Về cơ bản mô hình của tôi chạy như một hàm duy nhất có vòng lặp lớn trong vòng lặp để lặp cho số lần lặp mà tôi đang chạy. Vào cuối mỗi lần lặp của vòng lặp for, tôi muốn hiển thị mảng. Tại thời điểm này tôi đang sử dụng matplotlib để lưu hình ảnh ra một tập tin png, như hiển thị nó trên màn hình thông qua matplotlib dường như đóng băng quá trình python.

Tôi chắc chắn có cách để làm điều này với Glumpy, tôi chỉ không chắc chắn làm thế nào, và tôi không thể tìm thấy bất kỳ hướng dẫn hữu ích.

+0

Sự cố bạn gặp phải với quá trình làm lạnh matplotlib là khá phổ biến và thường chỉ yêu cầu sửa lỗi đơn giản, chẳng hạn như sử dụng * vẽ * thay vì * cốt truyện * hoặc chạy ipython ở chế độ * -pylab *, v.v. – tom10

+0

can bạn đăng mã mà bạn đang sử dụng để hiển thị mảng? Ngoài ra, phiên bản 'matplotlib .__'' của bạn là gì, bởi vì chúng đã thay đổi cách mà vòng lặp GUI được xử lý theo một số cách đáng kể gần đây. – wim

Trả lời

10

Tài liệu Glumpy khá không tồn tại! Dưới đây là một ví dụ về một mô phỏng đơn giản, so sánh mảng trực quan với glumpy chống 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() 

Sử dụng matplotlib với GTKAgg như backend của tôi và sử dụng blit để tránh vẽ nền mỗi lần, tôi có thể đạt khoảng 95 FPS. Với Glumpy Tôi nhận được khoảng 250-300 FPS, mặc dù tôi hiện đang là một thiết lập đồ họa khá crappy trên máy tính xách tay của tôi. Có nói rằng, Glumpy là một chút khó khăn hơn để có được làm việc, và trừ khi bạn đang đối phó với ma trận lớn, hoặc bạn cần một tốc độ khung hình rất cao vì lý do gì, tôi sẽ dính với sử dụng matplotlib với blit.

Các vấn đề liên quan