使用 plt.imshow 实现更快的刷新率

Bas*_*asj 5 python numpy matplotlib imshow

我想在进行计算时显示一些图像numpy

import numpy as np
import matplotlib.pyplot as plt
plt.ion()  # Turn the interactive mode on.
for i in range(100):
    A = np.random.randn(10,10)
    plt.imshow(A)
    plt.pause(0.001)
    # do some other numpy computations here (they take < 1 ms)
Run Code Online (Sandbox Code Playgroud)

显示图像不是很快,而是相当慢

我并不是要求每秒 100 帧,但我认为 30 fps 是可能的,但事实并非如此:经过几次迭代后,我在标准 i5 笔记本电脑(Windows 7 x64)上接近 2 fps。

如何拥有更快的imshow刷新率?

笔记:

  • 我已经尝试过Fast Live Plotting in Matplotlib / PyPlot的主要答案,但对于blit这样一个简单的任务来说,这似乎是一个复杂的方法(使用参数),而且我也没有得到 28 fps 而只有 15 fps

  • 我只想将矩阵显示为图像:没有边框,没有轴,没有子图等,我想这可以比解决方案Fast Live Plotting in Matplotlib / PyPlot更快地完成,也许不是使用 matplotlib 而是使用另一个库?

在此输入图像描述

Imp*_*est 3

这是因为您在每次迭代中都会创建一个新图像,最终会在图中生成 100 个图像。

创建动画的推荐方法是使用FuncAnimation并仅更改图像的数据,而不是始终绘制新图像。

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

im = plt.imshow(np.random.randn(10,10))

def update(i):
    A = np.random.randn(10,10)
    im.set_array(A)
    return im, text

ani = FuncAnimation(plt.gcf(), update, frames=range(100), interval=5, blit=False)

plt.show()
Run Code Online (Sandbox Code Playgroud)

即使interval设置为 5 毫秒,上述代码在我的计算机上仍以 50 fps 的速度运行。它不会比它能跑得更快。您现在可以使用 blitting,即blit=True,在这种情况下我看到 100 fps。这是 matplotlib 可以实现的极限,但它当然会根据计算机能力而变化。

但请注意,人脑无法解析 100 fps。有人说,25 是通常的帧率,因此大多数电影也使用这样的帧率。因此,这里甚至不需要使用位块传送,因为 50 fps 比您能够感知的要大。

如果出于任何原因您想要加快动画速度,则需要使用 matplotlib 之外的其他库。

参见例如


编辑后的问题中的一句话说不应该有边界。这是通过使图形大小服从图像的方面(方形图像 -> 方形图形)并将所有边距设置为零来实现的

plt.figure(figsize=(5,5))
plt.subplots_adjust(0,0,1,1)
Run Code Online (Sandbox Code Playgroud)

答案下面的评论坚持使用 for 循环。那看起来像

im = plt.imshow(np.random.randn(10,10))

plt.ion()
for i in range(100):
    
    A = np.random.randn(10,10)
    im.set_array(A)
    plt.pause(0.005)

plt.ioff()
plt.show()
Run Code Online (Sandbox Code Playgroud)

它会比使用 慢一些FuncAnimation,因为动画发生在 GUI 事件循环之外。另请注意,在这种情况下实现位块传送需要更多工作,如Matplotlib / PyPlot 中的快速实时绘图所示