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
.
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
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