在for循环中使用matplotlib imshow显示numpy数组
我有一个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 = 火。
在每个时间步骤(循环)中:
- 随机选择一个位置放一棵树,如果这个位置是空的,就种下这棵树。
- 一棵树有一定的概率会着火。
我想用颜色图来显示这个数组,以便可视化我的模型的演变过程。
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