使用Matplotlib imshow在for循环中显示NumPy数组

14

我有一个NumPy数组,其中的元素在for循环中更新:

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的animation模块)
奇怪的是,如果我尝试使用标准的Python提示执行此示例(http://matplotlib.org/examples/animation/dynamic_image2.html),则一切正常,而在Ipython笔记本上却无法正常工作。有人能解释一下为什么吗?
注释:
也许我过于简化了我的代码;
我正在研究森林火灾模型,该数组是一个填充有0 = 空站点,1 = 树木,2 = 火灾的网格。
在每个时间步骤(迭代):
1. 在随机选择的站点上放置一棵树,如果该站点为空,则种植树木 2. 树木以f的概率着火
我想使用colormap显示数组,以可视化我的模型的演变。

顺便说一句,你为什么不这样做:a += np.ones(a.shape) - robbrit
1
是的,我可以做到,但我只是为了解释我的问题而写下了这个数组和这个for循环。这不是我正在处理的实际代码 :) - Cecilia
2个回答

28

imshow(a)会将数组a的值作为像素值绘制出来,但它不会显示图像。为了在每次for循环迭代后查看图像,您需要添加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

4
所需的导入语句:from matplotlib.pyplot import imshow, show。 (翻译者注:这是一行Python代码,意思是从matplotlib.pyplot模块中导入imshowshow函数。) - StackG

0
对我来说,仅使用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模块只是为了让您暂停显示并控制帧速率到您想要的水平:这是可选的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接