3

我需要对数据进行动画处理,因为它们带有 2D histogram2d (也许以后是 3D,但我听说 mayavi 更好)。

这是代码:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt
import time, matplotlib


plt.ion()

# Generate some test data
x = np.random.randn(50)
y = np.random.randn(50)

heatmap, xedges, yedges = np.histogram2d(x, y, bins=5)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

# start counting for FPS
tstart = time.time()

for i in range(10):

    x = np.random.randn(50)
    y = np.random.randn(50)

    heatmap, xedges, yedges = np.histogram2d(x, y, bins=5)

    plt.clf()
    plt.imshow(heatmap, extent=extent)
    plt.draw()

# calculate and print FPS
print 'FPS:' , 20/(time.time()-tstart)

它返回 3 fps,显然太慢了。是在每次迭代中使用 numpy.random 吗?我应该使用 blit 吗?如果有怎么办?

文档有一些很好的例子,但对我来说,我需要了解一切都是做什么的。

4

2 回答 2

6

感谢@Chris,我再次查看了这些示例,并在这里发现了这篇非常有用的帖子。

正如@bmu 在他的回答(见帖子)中所说,使用动画。FuncAnimation 是我的方式。

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.animation as animation

def generate_data():
    # do calculations and stuff here
    return # an array reshaped(cols,rows) you want the color map to be  

def update(data):
    mat.set_data(data)
    return mat 

def data_gen():
    while True:
        yield generate_data()

fig, ax = plt.subplots()
mat = ax.matshow(generate_data())
plt.colorbar(mat)
ani = animation.FuncAnimation(fig, update, data_gen, interval=500,
                              save_count=50)
plt.show()
于 2012-06-30T15:31:58.570 回答
1

我怀疑它是np.histogram2d在每个循环迭代中使用的。或者在循环的每个循环迭代中,for您正在清除并绘制一个新图形。为了加快速度,您应该创建一次图形,然后在循环中更新图形的属性和数据。查看matplotlib 动画示例以获取有关如何执行此操作的一些指示。通常它涉及matplotlib.pyploy.plot在循环中调用 then ,调用axes.set_xdataand axes.set_ydata

但是,在您的情况下,请查看 matplotlib 动画示例动态图像 2。在此示例中,数据的生成与数据的动画分离(如果您有大量数据,这可能不是一个好方法)。通过将这两个部分分开,您可以看到哪个导致了瓶颈,numpy.histrogram2d或者imshowtime.time()在每个部分周围使用)。

Psnp.random.randn是一个伪随机数生成器。这些往往是简单的线性生成器,每秒可以生成数百万个(伪)随机数,因此这几乎肯定不是您的瓶颈 - 绘制到屏幕几乎总是比任何数字运算都慢的过程。

于 2012-06-14T12:18:47.570 回答