在for循环中使用matplotlib imshow显示numpy数组

16 投票
2 回答
24866 浏览
提问于 2025-04-21 08:26

我有一个numpy数组,它的元素在一个循环中不断更新:

a = np.array([[1,2,3],[4,5,6],[7,8,9]])

for t in range(0,10):
    imshow(a)

    for i in range(0,a.shape[0]):
        for j in range(0,a.shape[1]):
            a[i][j] += 1

我想在每次循环时显示这个数组,但用imshow()显示的时候不行,它只会在循环结束后显示一次图像。

补充一下,我是在Ipython笔记本上使用的。

我在网上找了很多方法,但没有一个在我的电脑上能用(比如我尝试过使用matplotlib的动画模块)。

奇怪的是,如果我在标准的python命令行中执行这个例子(http://matplotlib.org/examples/animation/dynamic_image2.html),一切都正常,但在Ipython笔记本上就不行。有人能告诉我这是为什么吗?

备注:

也许我简化了我的代码;

我正在做一个森林火灾模型,这个数组是一个网格,里面填充着0 = 空地,1 = 树,2 = 火。

在每个时间步骤(循环)中:

  1. 随机选择一个位置放一棵树,如果这个位置是空的,就种下这棵树。
  2. 一棵树有一定的概率会着火。

我想用颜色图来显示这个数组,以便可视化我的模型的演变过程。

2 个回答

1

对我来说,单纯使用 show() 有时候并不奏效,而且即使有效,随着时间推移,显示的速度也会变得很慢。为了解决这些问题,我会导入 display,然后使用它的 display()clear_output() 方法。

import numpy as np
import matplotlib.pyplot as plt
from IPython import display
import time

pause_time = 0.2  # seconds between frames
a = np.random.rand(3,3)

for t in range(0,10):
    plt.imshow(a)
    plt.title(t)
    display.display(plt.gcf())
    display.clear_output(wait=True)
    time.sleep(pause_time)

    a = np.random.rand(3,3)

以上内容改编自 这个回答。这里的 time 模块只是用来让你暂停显示,并控制你想要的帧率:这一步是可选的。

29

imshow(a) 这个命令会把数组 a 的值当作像素值来画图,但它不会直接显示这个图像。如果你想在每次循环后看到图像,就需要加上 show()

这样做就能达到你想要的效果:

from matplotlib.pyplot import imshow, show    

a = np.array([[1,2,3],[4,5,6],[7,8,9]])

for t in range(0,10):
    imshow(a)
    show()

    for i in range(0,a.shape[0]):
        for j in range(0,a.shape[1]):
            a[i][j] += 1

撰写回答