gpt4 book ai didi

python - matplotlib imshow、ArtistAnimation 和类属性

转载 作者:太空宇宙 更新时间:2023-11-04 10:37:35 25 4
gpt4 key购买 nike

我正在尝试用 Python 编写 Conway 的生命游戏并展示进化过程。我无法显示输出。我在下面粘贴了我的整个代码。

我以这个例子为基础:from the matplotlib doc .我的动画是静态的,但如果我使用

ims.append([plt.imshow(world.state+0, cmap=plt.cm.binary, interpolation='nearest')])

它动画正确。我试着写了一个函数wolrd.get_state(),以为是某种求值问题,无果。

这让我抓狂,我在这里错过了什么?

谢谢

    import numpy as np
from scipy.signal import convolve2d

import matplotlib.pyplot as plt
import matplotlib.animation as animation


class World():
"""world information"""

def __init__(self, grid):
# noinspection PyNoneFunctionAssignment
self.state = np.empty(grid.shape)
self.__x_size = len(grid[0, :])
self.__y_size = len(grid[:, 0])
self.__x = range(self.__x_size)
self.__y = range(self.__y_size)
for i in self.__x:
for j in self.__y:
self.state[i, j] = grid[i, j]

def evolve(self):
alive_neighbours = convolve2d(self.state, np.ones((3, 3)), mode='same', boundary='wrap') - self.state
for i in self.__y:
for j in self.__x:
if alive_neighbours[i, j] < 2:
self.state[i, j] = 0
elif alive_neighbours[i, j] == 3:
self.state[i, j] = 1
elif alive_neighbours[i, j] > 3:
self.state[i, j] = 0
# self.state = np.random.randint(2, size=(self.__x_size, self.__y_size ))


if __name__ == "__main__":
nbx = 5
nby = 5
nb_gen = 5

initial_seed = np.random.randint(2, size=(nbx, nby))
world = World(initial_seed)

ims = []
fig = plt.figure()

for i in range(nb_gen):
ims.append([plt.imshow(world.state, cmap=plt.cm.binary, interpolation='nearest')])
world.evolve()

ani = animation.ArtistAnimation(fig, ims, interval=500, blit=True, repeat_delay=1000)

plt.show()

注意:我已经成功使用:

def animate(i):
world.evolve()
return (plt.imshow(world.state, cmap=plt.cm.binary, interpolation='nearest'),)

ani = animation.FuncAnimation(fig, animate, frames=nb_gen, interval=500, blit=True, repeat_delay=1000)

但这不是我想要的。

最佳答案

动画的每一帧都显示相同的世界状态。

因为世界类只修改状态,所以对每个帧的相同对象的引用被传递到 imshow() 中。动画的每一帧都引用同一个数组。

Matplotlib 在调用 plt.show() 之前不会将动画绘制到屏幕上,因此只能看到传入 imshow() 的数组的最终版本,即 World.state 的最终版本。

这个道理是一样的

a = [1, 2, 3]
b = a
a.append(4)
print(b)

输出 [1, 2, 3, 4]。 b 指向 a,所以当 a 改变时,b 也会改变。

复制要显示的图像可以解决问题。

ims.append([plt.imshow(world.state.copy(), cmap=plt.cm.binary, interpolation='nearest')])

这也是 world.state + 0 和 np.random.randint(2, size=(self.__x_size, self.__y_size )) 起作用的原因:它们都创建新数组,并且不修改已经传递的数组进入 imshow()。

关于python - matplotlib imshow、ArtistAnimation 和类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com