Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用plt.imshow提高刷新速度_Python_Numpy_Matplotlib_Imshow - Fatal编程技术网

Python 使用plt.imshow提高刷新速度

Python 使用plt.imshow提高刷新速度,python,numpy,matplotlib,imshow,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

我想在执行
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)
将numpy导入为np
将matplotlib.pyplot作为plt导入
plt.ion()#打开交互模式。
对于范围(100)内的i:
A=np.random.randn(10,10)
plt.imshow(A)
plt.暂停(0.001)
#在这里进行一些其他numpy计算(计算时间<1毫秒)
它不是快速显示图像,而是相当慢

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

如何获得更快的
imshow
刷新率?

注:

  • 我已经尝试了来自的主要答案,但对于这样一个简单的任务,这里似乎是一个复杂的方法(使用
    blit
    参数),而且我没有得到28 fps,但只有15 fps

  • 我只想将矩阵显示为图像:无边框、无轴、无子图等,我想这可能比解决方案更快,可能不是使用matplotlib,而是另一个库


这是因为在每次迭代中创建一个新图像,最终在图形中生成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()
即使
间隔设置为5毫秒,上述代码在我的计算机上以50 fps的速度运行。它不会跑得比它能跑的快。您现在可以使用blit,即
blit=True
,在这种情况下,我看到的是100 fps。这是matplotlib所能达到的极限,但它当然会根据计算机的功率而有所不同

然而,请注意,人脑不能分辨100 fps。有人说,25是通常的帧速率,因此大多数电影也使用这种帧速率。因此,这里甚至不需要使用blitting,因为50 fps比你能感知到的要大

如果出于任何原因希望加快动画速度,则需要使用matplotlib以外的其他库

见例


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

plt.figure(figsize=(5,5))
plt.subplots_adjust(0,0,1,1)

答案下面的注释坚持使用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()

这将比使用
FuncAnimation
稍微慢一点,因为动画发生在GUI事件循环之外。还要注意的是,在这种情况下实现blitting需要做更多的工作,如

中所示,多亏了OpenCV,我找到了一个更快的解决方案。下面的代码在我的计算机上运行2秒钟,即能够以500 fps的速度渲染(我知道人眼看不到这一点,但很高兴知道这种方法非常快)


@G.Anderson的可能重复项请参见编辑后的问题(请参见注释)。可能重复项我已经尝试过类似的方法@user2699,但没有超过20 fps。请参阅编辑后的问题和我发布的答案。谢谢。但我认为您的代码“预计算”了一个动画,并在最后显示它。我想在循环时显示图像,而不是等到最后才显示动画。怎么做?不,如果你想预计算动画,你可以使用
ArtistAnimation
而不是
FuncAnimation
。哦,对了,我明白了。另外:我更喜欢“正常”执行for循环(在我的实际代码中为100k次迭代),就像问题中一样,每100次迭代显示/绘制a的当前状态。必须从FuncAnimation对象开始所有操作对我的应用程序来说有点不方便。有没有办法保持一个简单的for循环并从那里调用绘图?如果愿意,您仍然可以使用for循环。我更新了答案。不过,几乎没有任何理由这么做。为什么不先计算完整的数据,然后每100步创建一个动画?@ImportanceOfBeingErnest如何保持
FuncAnimation
中显示的相同色条?效果非常好!
import numpy as np
import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)

for i in range(1000):
    A = np.random.randn(10,10)
    cv2.imshow("img", A)
    cv2.waitKey(1)  # it's needed, but no problem, it won't pause/wait